解析SpringSecurity⾃定义登录验证成功与失败的结果处
理问题
⼀、需要⾃定义登录结果的场景
在我之前的⽂章中,做过登录验证流程的源码解析。其中⽐较重要的就是
当我们登录成功的时候,是由AuthenticationSuccessHandler进⾏登录结果处理,默认跳转到defaultSuccessUrl配置的路径对应的资源页⾯(⼀般是⾸页index.html)。
当我们登录失败的时候,是由AuthenticationfailureHandler进⾏登录结果处理,默认跳转到failureUrl配置的路径对应的资源页⾯(⼀般是登录页login.html)。
但是在web应⽤开发过程中需求是千变万化的,有时需要我们针对登录结果做个性化处理,⽐如:
我们希望不同的⼈登陆之后,看到不同的⾸页
我们应⽤是前后端分离的,验证响应结果是JSON格式数据,⽽不是页⾯跳转
以上的这些情况,使⽤Spring Security作为安全框架的时候,都需要我们使⽤本节学到的知识进⾏⾃定义
的登录验证结果处理。
⼆、⾃定义登陆成功的结果处理
为了满⾜上⾯的需求,我们该如何去做呢?下⾯⼀⼩节我们来说明⼀下。AuthenticationSuccessHandler接⼝是Security提供的认证成功处理器接⼝,我们只需要去实现它即可。但是通常来说,我们不会直接去实现AuthenticationSuccessHandler接⼝,⽽是继承SavedRequestAwareAuthenticationSuccessHandler 类,这个类会记住⽤户上⼀次请求的资源路径,⽐如:⽤户请求books.html,没有登陆所以被拦截到了登录页,当你万成登陆之后会⾃动跳转到books.html,⽽不是主页⾯。
@Component
public class MyAuthenticationSuccessHandler
extends SavedRequestAwareAuthenticationSuccessHandler {
//在application配置⽂件中配置登陆的类型是JSON数据响应还是做页⾯响应
@Value("${spring.security.logintype}")
private String loginType;
private static ObjectMapper objectMapper = new ObjectMapper();
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response,
Authentication authentication)
throws ServletException, IOException {
if (loginType.equalsIgnoreCase("JSON")) {
response.setContentType("application/json;charset=UTF-8");
} else {
/
/ 会帮我们跳转到上⼀次请求的页⾯上
}
}
}
在上⾯的⾃定义登陆成功处理中,既适应JSON前后端分离的应⽤登录结果处理,也适⽤于模板页⾯跳转应⽤的登录结果处理
ObjectMapper 是Spring Boot默认集成的JSON数据处理类库Jackson中的类。
AjaxResponse是⼀个⾃定义的通⽤的JSON数据接⼝响应类。
html怎么实现登录验证功能三、⾃定义登录失败的结果处理
这⾥我们同样没有直接实现AuthenticationFailureHandler接⼝,⽽是继承SimpleUrlAuthenticationFailureHandler 类。该类中默认实现了登录验证失败的跳转逻辑,即登陆失败
之后回到登录页⾯。我们可以利⽤这⼀点简化我们的代码。
@Component
public class MyAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
//在application配置⽂件中配置登陆的类型是JSON数据响应还是做页⾯响应
@Value("${spring.security.logintype}")
private String loginType;
private static ObjectMapper objectMapper = new ObjectMapper();
@Override
public void onAuthenticationFailure(HttpServletRequest request,
HttpServletResponse response,
AuthenticationException exception)
throws IOException, ServletException {
if (loginType.equalsIgnoreCase("JSON")) {
response.setContentType("application/json;charset=UTF-8");
objectMapper.writeValueAsString(
<(
new CustomException(
CustomExceptionType.USER_INPUT_ERROR,
"⽤户名或密码存在错误,请检查后再次登录"))));
} else {
response.setContentType("text/html;charset=UTF-8");
}
}
}
在上⾯的⾃定义登陆失败处理中,既适应JSON前后端分离的应⽤登录失败结果处理,也适⽤于模板页⾯跳转应⽤的登录失败结果处理
登陆失败之后,将默认跳转到默认的failureUrl,即登录界⾯。
四、配置SecurityConfig
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Resource
private MyAuthenticationSuccessHandler myAuthenticationSuccessHandler;
@Resource
private MyAuthenticationFailureHandler myAuthenticationFailureHandler;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable() //禁⽤跨站csrf攻击防御,后⾯的章节会专门讲解
.formLogin()
.successHandler(myAuthenticationSuccessHandler)
.failureHandler(myAuthenticationFailureHandler)
.defaultSuccessUrl("/index")//登录认证成功后默认转跳的路径
.failureUrl("/login.html") //登录认证是被跳转页⾯
}
将⾃定义的AuthenticationSuccessHandler和AuthenticationFailureHandler注⼊到Spring Security配置类中
使⽤fromlogin模式,配置successHandler和failureHandler。
并且配置defaultSuccessUrl和failureUrl
总结
以上所述是⼩编给⼤家介绍的SpringSecurity⾃定义登录验证成功与失败的结果处理,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!
如果你觉得本⽂对你有帮助,欢迎转载,烦请注明出处,谢谢!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论