SpringBoot集成Spring Security(3)——异常处理

SpringBoot集成Spring Security(3)——异常处理

  登录异常是需要我们进行处理的,在第一章中我们只是重定向到了一个/login?error界面并没有显示任何的错误信息。

1. 常见的异常

  • UsernameNotFoundException(用户不存在)
  • DisabledException(用户已被禁用)
  • BadCredentialsException(坏的凭据)
  • LockedException(账户锁定)
  • AccountExpiredException (账户过期)
  • CredentialsExpiredException(证书过期)
    这些异常都是AuthenticationException 的子类。

2.源码分析

  从AbstractAuthenticationProcessingFilter 中找到关于AuthenticationException 的处理:
(1) 在 doFilter() 中,捕捉了 AuthenticationException 异常,并交给了 unsuccessfulAuthentication() 处理。
在这里插入图片描述
(2) .进入unsuccessfulAuthentication()方法,其转交给SimpleUrlAuthenticationFailureHandler()类的onAuthenticationFailure()方法
在这里插入图片描述
(3).在onAuthenticationFailure()中,会对是否设置了defaultFailureUrl()进行判断:

  • 如果没有设置,即为null,直接返回401错误(HttpStatus.UNAUTHORIZED的值)
  • 如果设置了,先执行saveException()方法。然后判断 forwardToDestination ,即是否是服务器跳转,默认使用重定向即客户端跳转。
    在这里插入图片描述
    (4).在 saveException() 方法中,首先判断forwardToDestination,如果使用服务器跳转则写入 request,客户端跳转则写入 session。写入名为 SPRING_SECURITY_LAST_EXCEPTION ,值为 AuthenticationException
    在这里插入图片描述
    至此 Spring security 完成了异常处理,总结一下流程:

–> AbstractAuthenticationProcessingFilter.doFilter()

–> AbstractAuthenticationProcessingFilter.unsuccessfulAuthentication()

–> SimpleUrlAuthenticationFailureHandler.onAuthenticationFailure()

–> SimpleUrlAuthenticationFailureHandler.saveException()

3.异常处理

(1).指定显示错误信息的url,WebSecurityConfig中添加.failureUrl("/login/error")
在这里插入图片描述
(2).在Controller中处理异常

 //登录失败信息
    @RequestMapping("/login/error")
    public void loginError(HttpServletResponse response, HttpServletRequest request){
        response.setContentType("text/html;charset=utf-8");
        AuthenticationException exception= (AuthenticationException) request.getSession().getAttribute("SPRING_SECURITY_LAST_EXCEPTION");
        try{
            response.getWriter().write(exception.toString());
        } catch (IOException e) {
                e.printStackTrace();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值