SpringBoot集成SpringSecurity - 异常处理(三)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot集成SpringSecurity - 异常处理(三)相关的知识,希望对你有一定的参考价值。

参考技术A 源码地址: https://github.com/springsecuritydemo/microservice-auth-center03

当我们登录失败的时候,SpringSecurity 帮我们跳转到了 /login?error URL,奇怪的是不管是控制台还是网页上都没有打印错误信息。

这是因为首先 /login?error 是SpringSecurity 默认的失败 URL,其次如果你不自己处理这个异常,这个异常时不会被处理的。

我们先来列举下一些 SpringSecurity 中常见的异常:

SpringSecurity的异常处理是在过滤器中进行的,我们在 AbastrctAuthenticationProcessingFilter 中找到了对 Authentication 的处理:

至此 SpringSecurity 完成了异常处理,总结下流程:

–> AbstractAuthenticationProcessingFilter .doFilter()
–> AbstractAuthenticationProcessingFilter. unsuccessfulAuthentication()
–> SimpleUrlAuthenticationFailureHandler. onAuthenticationFailure()
–> SimpleUrlAuthenticationFailureHandler. saveException()

上面通过源码看着挺复杂,但真正处理起来SpringSecurity为我们提供了方便的方式,我们只需要指定错误的url,然后在该方法中对异常进行处理即可。

首先我们修改 CustomUserDetailsService loadUserByUsername() 方法的返回值:

细心的同学再完成上面功能是会发现,当我们输入的用户名不存在时,不会抛出 UserNameNotFoundException ,而是抛出 BadCredentialsException 这个异常,如果有需要区分 用户名不存在和密码错误的,可参考 https://blog.csdn.net/wzl19870309/article/details/70314085 。

以上是关于SpringBoot集成SpringSecurity - 异常处理(三)的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot项目启动后访问任意接口都会跳转到一个莫名其妙的login登录页面

SpringSecurity解决跨域问题,在SpringBoot整合SprinSecurity中如何用前后端分离Ajax登录,Ajax登录返回状态200还是近error

001.camunda入门(springboot集成篇)

在邮递员上发布请求但不在浏览器中(代码状态:415) - Spring Boot,thymeleaf

springboot集成ES,以及应用

SpringBoot集成Kafka