解析SpringSecurity自定义登录验证成功与失败的结果处理问题

 更新时间:2019年11月20日 08:26:18   作者:字母哥博客  
这篇文章主要介绍了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");
      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自定义登录验证成功与失败的结果处理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • Java设计模式之原型模式详细解析

    Java设计模式之原型模式详细解析

    这篇文章主要介绍了Java设计模式之原型模式详细解析,原型模式就是用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象,需要的朋友可以参考下
    2023-11-11
  • 浅谈Mybatis Plus的BaseMapper的方法是如何注入的

    浅谈Mybatis Plus的BaseMapper的方法是如何注入的

    我们在用的时候经常就是生产自定义的Mapper继承自BaseMapper,那么BaseMapper怎么被注入到mybatis里的,本文就详细的介绍一下,感兴趣的可以了解一下
    2021-09-09
  • 在非spring环境中调用service中的方法

    在非spring环境中调用service中的方法

    非Spring环境指的是不使用Spring框架来管理和配置应用程序的运行时环境,本文将给大家介绍如何在非spring环境中调用service中的方法,文中有详细实现步骤,需要的朋友可以参考下
    2024-03-03
  • springboot内置tomcat调优并发线程数解析

    springboot内置tomcat调优并发线程数解析

    这篇文章主要介绍了springboot内置tomcat调优并发线程数解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java堆排序算法详解

    Java堆排序算法详解

    这篇文章主要为大家详细介绍了Java堆排序算法的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • java面向对象之学生信息管理系统

    java面向对象之学生信息管理系统

    这篇文章主要为大家详细介绍了java面向对象之学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 详细分析Java Lambda表达式

    详细分析Java Lambda表达式

    这篇文章主要介绍了Java Lambda表达式的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • java实现注册登录系统

    java实现注册登录系统

    这篇文章主要为大家详细介绍了java实现注册登录系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • spring boot security自定义认证的代码示例

    spring boot security自定义认证的代码示例

    这篇文章主要介绍了spring boot security自定义认证,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Netty分布式Server启动流程服务端初始化源码分析

    Netty分布式Server启动流程服务端初始化源码分析

    本章主要讲解server启动的关键步骤, 读者只需要了解server启动的大概逻辑, 知道关键的步骤在哪个类执行即可, 并不需要了解每一步的运作机制, 之后会对每个模块进行深度分析
    2022-03-03

最新评论