源码地址:https://github.com/jitwxs/blog_sample
文章目录

一、常见异常
二、源码分析
三、处理异常
不知道你有没有注意到,当我们登陆失败时候,Spring security 帮我们跳转到了 /login?error Url,奇怪的是不管是控制台还是网页上都没有打印错误信息。

这是因为首先 /login?error 是 Spring security 默认的失败 Url,其次如果你不手动处理这个异常,这个异常是不会被处理的。

一、常见异常

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

UsernameNotFoundException(用户不存在)
DisabledException(用户已被禁用)
BadCredentialsException(坏的凭据)
LockedException(账户锁定)
AccountExpiredException (账户过期)
CredentialsExpiredException(证书过期)

以上列出的这些异常都是 AuthenticationException 的子类,然后我们来看看 Spring security 如何处理 AuthenticationException 异常的。

二、源码分析

我们知道异常处理一般在过滤器中处理,我们在 AbstractAuthenticationProcessingFilter 中找到了对 AuthenticationException 的处理:

(1)在 doFilter() 中,捕捉了 AuthenticationException 异常,并交给了 unsuccessfulAuthentication() 处理。

(2)在 unsuccessfulAuthentication() 中,转交给了 SimpleUrlAuthenticationFailureHandler 类的 onAuthenticationFailure() 处理。

(3)在onAuthenticationFailure()中,首先判断有没有设置defaultFailureUrl。

如果没有设置,直接返回 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()

三、处理异常

上面源码说了那么多,真正处理起来很简单,我们只需要指定错误的url,然后再该方法中对异常进行处理即可。

(1)指定错误Url,WebSecurityConfig中添加.failureUrl("/login/error")

...

@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// 如果有允许匿名的url,填在下面
// .antMatchers().permitAll()
.anyRequest().authenticated()
.and()
// 设置登陆页
.formLogin().loginPage("/login")
// 设置登陆成功页
.defaultSuccessUrl("/").permitAll()
// 登录失败Url
.failureUrl("/login/error")
// 自定义登陆用户名和密码参数,默认为username和password
// .usernameParameter("username")
// .passwordParameter("password")
.and()
.logout().permitAll()
// 自动登录
.and().rememberMe()
.tokenRepository(persistentTokenRepository())
// 有效时间:单位s
.tokenValiditySeconds(60)
.userDetailsService(userDetailsService);// 关闭CSRF跨域
http.csrf().disable();
}
...

  

(2)在Controller中处理异常

@RequestMapping("/login/error")
public void loginError(HttpServletRequest request, HttpServletResponse response) {
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();
}
}

  

我们首先获取了 session 中的 SPRING_SECURITY_LAST_EXCEPTION 。为了演示,我只是简单的将错误信息返回给了页面。运行程序,当我们输入错误密码时:


---------------------
作者:Jitwxs
来源:CSDN
原文:https://blog.csdn.net/yuanlaijike/article/details/80250389
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/telwanggs/p/10802968.html

SpringBoot集成Spring Security(3)——异常处理相关推荐

  1. SpringBoot集成Spring Security —— 第二章自动登录

    文章目录 一.修改login.html 二.两种实现方式 2.1 Cookie 存储 2.2 数据库存储 2.2.1 基本原理 2.2.2 代码实现 三.运行程序 在上一章:SpringBoot集成S ...

  2. SpringBoot集成Spring Security(二)注册 、密码加密、修改密码

    SpringBoot集成Spring Security(一)登录注销 写在前面 上一节创建了项目并且利用Spring Security完成了登录注销功能,这里继续说一下注册.密码加密和找回密码,代码注 ...

  3. SpringBoot集成Spring Security(一)登录注销

    同个人网站 https://www.serendipper-x.cn/,欢迎访问 ! SpringBoot集成Spring Security(二)注册 .密码加密.修改密码 写在前面 Spring S ...

  4. SpringBoot集成Spring Security(2)——自动登录

    在上一章:SpringBoot集成Spring Security(1)--入门程序中,我们实现了入门程序,本篇为该程序加上自动登录的功能. 文章目录 一.修改login.html 二.两种实现方式 2 ...

  5. springboot集成Spring Security oauth2(八)

    由于公司项目需要,进行SpringBoot集成Spring Security oauth2,几乎搜寻网上所有大神的案例,苦苦不能理解,不能完全OK. 以下是借鉴各大神的代码,终于demo完工,请欣赏 ...

  6. SpringBoot 集成 Spring Security

    Spring Security Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架.它实际上是保护基于spring的应用程序的标准. Spring Security是一个 ...

  7. SpringBoot集成Spring Security(1)——入门程序

    因为项目需要,第一次接触 Spring Security,早就听闻 Spring Security 功能强大但上手困难,学习了几天出入门道,特整理这篇文章希望能让后来者少踩一点坑(本文附带实例程序,请 ...

  8. springboot集成spring security实现登录和注销

    文章目录 一.导入坐标 二.Users实体类及其数据库表的创建 三.controller,service,mapper层的实现 四.核心–编写配置文件 五.页面的实现 运行结果 一.导入坐标 < ...

  9. springboot集成spring security安全框架入门篇

    一. :spring security的简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下 ...

最新文章

  1. Linux中autoduck批量对接,求助:关于autodock模拟分子对接
  2. MySQL授权用户及密码恢复设置
  3. docker项目部署 php_「Docker部署PHP+Vue项目」- 海风纷飞Blog
  4. Unity 叉乘 vector3 四元数 和声音组件
  5. 新手入门:手把手从PHP环境到ThinkPHP6框架下载
  6. Irc 客户端 Android,Revolution IRC | F-Droid - Free and Open Source Android App Repository
  7. 许愿墙 php源码,许愿网许愿墙 v1 共享版
  8. word每行的末尾箭头怎么去掉_如何将word中箭头去掉 word中的箭头怎么去掉
  9. 12、【易混淆概念集】-第六章3 资源平衡 VS 资源平滑 进度压缩 制定进度计划 定义活动 里程碑清单
  10. 请设计输出实数的格式,包括:⑴一行输出一个实数;⑵一行内输出两个实数;⑶一行内输出三个实数。实数用6.2f格式输出。
  11. 完美世界:你病了,要么离职,要么996,要么小黑屋三选一
  12. Java 2 实用教程学习
  13. trunk+vtp+链路冗余 理解
  14. js判断字符超长度中间用...替换
  15. 初一知识用计算机进行运算,【初一数学】必考的21个知识点!
  16. allowMultiQueries 设置为true不生效问题
  17. 韦东山:驱动和APP,根本不应该上升到互相鄙视的地步
  18. 云linux界面设计,开源企业级的UI设计语言Ant Design 3.10.2发布下载
  19. 求余数联系和赋值运算
  20. 小新700显卡驱动下载地址

热门文章

  1. linux服务器进虚拟机,初次登录 Linux 服务器马上要做的 9 件事|Linux 中国
  2. java父类静态 子类调用_在java 中 父类定义的静态方法 子类 调用时候 如何 知道 是哪个子类调用的...
  3. Spark源码分析之DiskBlockMangaer分析
  4. 计算机第二章基础知识习题,计算机基础知识习题.docx
  5. xcode 怎么调用midi开发录音_音频应用专业录音声卡:雅马哈UR242声卡教程
  6. 网页设计图片向上浮动_HTML5 背景图片漂浮/浮动特效
  7. vc 时间字符串转时间戳_Instant(时间戳)
  8. 链接脚本文件(*.lds)
  9. 内存的工作原里(二)
  10. java简单功能测试,java 自动化测试小功能集锦