0.前言
最近开发项目的时候遇到了和SpringSecurity相关的一些问题,但是之前并没有去了解过SpringSecurity,导致改系统安全权限验证的时候就比较吃力了,目前项目开发大多都直接用脚手架直接开发,系统安全权限验证已经形成了,所以并不是自己写的,自己理解起来会更慢一些,所以这篇文章就是为了分析SpringSecurity的认证流程而写的
1.本质
SpringSecurity的本质就是一个过滤器链,内部包含了提供各种功能的过滤器,基本案例中的过滤器链如下图所示:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eNqNTU6z-1659516452012)(png/image-20220731204712101.png)]](https://img-blog.csdnimg.cn/282b3b76f4f24bd4901391b2be94eec6.png)
上图中仅展示了部分核心过滤器,非核心过滤器没有显示
UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求。基本案例的认证工作主要有它负责
ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException
FilterSecurityInterceptor:负责权限校验的过滤器
可以通过Debug查看SpingSecurity过滤器链中有哪些过滤器以及它们的先后顺序
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bqhX6pkW-1659516452013)(png/image-20220731210040557.png)]](https://img-blog.csdnimg.cn/c1a56da056db4ae7961ba0bd1f117b49.png)
2.认证流程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U9Jq5uPm-1659516452014)(png/image-20220731210637075.png)]](https://img-blog.csdnimg.cn/13f115e9c3034c80a3dd662ef4c6b959.png)
上面的图所展示的就是整个SpringSecurity的认证流程
认证流程中的核心类
- Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息
- AuthenticationManager接口:定义了认证Authentication的方法
- UserDetailsService接口:加载用户特定数据的核心接口。里面定义了一个根据用户名查询用户信息的方法
- UserDetails接口:提供核心用户信息。通过UserDetailsService根据用户名获取处理的用户信息要封装成UserDetails对象返回。然后将这些信息封装到Authentication对象中
- UsernamePasswordAuthenticationFilter实现类:实现了我们最常用的基于用户名和密码的认证逻辑,封装Authentication对象
- DaoAuthenticationProvider实现类:是AuthenticationManager中管理的其中一个Provider,因为是要访问数据库,所以叫Dao
准备
利用idea生成一个SpringBoot工程,然后加入Spring web、SpringSecurity依赖即可,直接以Debug模式启动启动类,并在下图中打入断点
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fPvwAlKI-1659516452014)(png/image-20220731222133173.png)]](https://img-blog.csdnimg.cn/532a95ba8d5f4356a8213c1a20b962f1.png)
2.1 第一步
通过浏览器提交用户名密码

2.2 第二步
默认的登录是用UsernamepasswordAuthencitionFilter过滤器去拦截
通过Authentication接口的实现子类UsernamePasswordAuthenticationToken封装Authentication对象,这里只有用户名和密码,还没有权限
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JbW5h6fm-1659516452014)(png/image-20220731222822228.png)]](https://img-blog.csdnimg.cn/1a069c2c2b684e8e9b0956ba5da35a62.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ItPrJFJP-1659516452015)(png/image-20220731195519714.png)]](https://img-blog.csdnimg.cn/72a9922bff844d719420472c327052e0.png)
2.3 第三步
调用AuthenticationManager的authenticate方法进行认证
因为AuthenticationManager中管理了一群Provider,所以调用的就是那一群Provider的authenticate方法进行认证
调用DaoAuthenticationProvider的authenticate方法进行认证
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bCy9F8Xt-1659516452015)(png/image-20220731200645239.png)]](https://img-blog.csdnimg.cn/f548488ec4134663b637736a10b54a2c.png)
DaoAuthenticationProvider是AuthenticationProvider接口的其中一个实现类
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Lr8P3Nw-1659516452015)(png/image-20220731175827967.png)]](https://img-blog.csdnimg.cn/087ac892f48043f782d8d8ab8a0b80e6.png)
2.4 第四步
调用DaoAuthenticationProvider的authenticate方法进行认证
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PT0iRpem-1659516452016)(png/image-20220731223533801.png)]](https://img-blog.csdnimg.cn/09592dc55c43498db4373398410c576e.png)
2.5 第五步
获得DaoAuthenticationProvider的UserDetailService对象,再调用此对象的loadUserByUsername方法查询用户信息
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kqSpYF3H-1659516452016)(png/image-20220731202249826.png)]](https://img-blog.csdnimg.cn/987c17790991447c86b811941f0a4639.png)
总结
上面五步就是SpringSecurity的基本认证流程,其实从基本认证流程中不难看出,我们可以重写或者替换UsernamePasswordAuthenticationFilter过滤器,用以添加我们需要的业务处理逻辑,并且可以实现UserDetailsService接口,加入Spring Data JPA或者Mybatis用来访问数据库中的用户信息
待更新…
版权归原作者 fish-aroma 所有, 如有侵权,请联系我们删除。