解析SpringSecurity自定义登录验证成功与失败的结果处理问题
2019-12-02 18:12
2551 查看
一、需要自定义登录结果的场景
在我之前的文章中,做过登录验证流程的源码解析。其中比较重要的就是
- 当我们登录成功的时候,是由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"); response.getWriter().write(objectMapper.writeValueAsString(AjaxResponse.success())); } else { // 会帮我们跳转到上一次请求的页面上 super.onAuthenticationSuccess(request, response, authentication); } } }
- 在上面的自定义登陆成功处理中,既适应JSON前后端分离的应用登录结果处理,也适用于模板页面跳转应用的登录结果处理
- ObjectMapper 是Spring Boot默认集成的JSON数据处理类库Jackson中的类。
- AjaxResponse是一个自定义的通用的JSON数据接口响应类。
三、自定义登录失败的结果处理
这里我们同样没有直接实现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"); response.getWriter().write( objectMapper.writeValueAsString( AjaxResponse.error( new CustomException( CustomExceptionType.USER_INPUT_ERROR, "用户名或密码存在错误,请检查后再次登录")))); } else { response.setContentType("text/html;charset=UTF-8"); super.onAuthenticationFailure(request, response, exception); } } }
- 在上面的自定义登陆失败处理中,既适应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自定义登录验证成功与失败的结果处理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
您可能感兴趣的文章:
相关文章推荐
- SpringSecurity系列之自定义登录验证成功与失败的结果处理
- Spring Security教程(10)---- 自定义登录成功后的处理程序及修改默认验证地址
- Spring Security教程(10)---- 自定义登录成功后的处理程序及修改默认验证地址
- Spring Security教程(10)---- 自定义登录成功后的处理程序及修改默认验证地址
- Spring-Security笔记9 自定义登录成功后的处理程序及修改默认验证地址
- Spring Security教程(10)---- 自定义登录成功后的处理程序及修改默认验证地址
- Spring Security(六):自定义登录成功与失败处理
- mall 后台用户不能登陆 后台登录成功又跳回登录界面的问题及出现问题的处理
- 解决apache httpd + tomcat session复制失败导致登录不成功问题
- 关于使用终端工具远程登录连接Linux服务器失败或者登录成功后自动断开问题
- Tomcat部署应用,客户端阻止cookie时,成功登录后,还是出现登录失败的问题解决
- Socket通信自定义mina 框架过滤器解析(处理粘包、断包问题)
- 自定义Spring Security的身份验证失败处理
- 在安装discuz!nt时,数据库用户登录失败的问题时,sql server 2008 数据库更改登录模式(sql server 2008 混合登陆中SqlServer身份验证用户名密码)
- AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
- spring boot security 自定义登陆、成功处理、失败处理
- asp.net验证组件membership登录失败的问题
- SQL2005的sa用户登录问题 用户名无法登录sql2005"已成功与服务器建立连接,但是在登录过程中发生错误" 用户"sa"登陆失败,SQL Server错误:18456
- jsf的初步使用(包括jsf框架的引入、用户登录、自定义表单验证、valueChangeEvent值变更事件处理做的级联下拉框)
- 腾讯RTX登录提示失败问题及处理办法