SpringSecurity认证流程(超级详细)

本文介绍了SpringSecurity的认证流程,从本质上讲解了其作为一个过滤器链的工作方式,重点解析了UsernamePasswordAuthenticationFilter在登录过程中的作用,以及AuthenticationManager、UserDetailsService和DaoAuthenticationProvider在认证过程中的职责。通过调试SpringSecurity的过滤器链,可以了解如何进行用户权限校验和数据库查询用户信息的过程,为自定义业务逻辑提供了思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 .前言

最近开发项目的时候遇到了和SpringSecurity相关的一些问题,但是之前并没有去了解过SpringSecurity,导致改系统安全权限验证的时候就比较吃力了,目前项目开发大多都直接用脚手架直接开发,系统安全权限验证已经形成了,所以并不是自己写的,自己理解起来会更慢一些,所以这篇文章就是为了分析SpringSecurity的认证流程而写的


2 .本质

SpringSecurity的本质就是一个过滤器链,内部包含了提供各种功能的过滤器,基本案例中的过滤器链如下图所示:

 上图中仅展示了部分核心过滤器,非核心过滤器没有显示

UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求。基本案例的认证工作主要有它负责

ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException

FilterSecurityInterceptor:负责权限校验的过滤器

可以通过Debug查看SpingSecurity过滤器链中有哪些过滤器以及它们的先后顺序


3.认证流程

上面的图所展示的就是整个SpringSecurity的认证流程

认证流程中的核心类

    Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息
    AuthenticationManager接口:定义了认证Authentication的方法
    UserDetailsService接口:加载用户特定数据的核心接口。里面定义了一个根据用户名查询用户信息的方法
    UserDetails接口:提供核心用户信息。通过UserDetailsService根据用户名获取处理的用户信息要封装成UserDetails对象返回。然后将这些信息封装到Authentication对象中
    UsernamePasswordAuthenticationFilter实现类:实现了我们最常用的基于用户名和密码的认证逻辑,封装Authentication对象
    DaoAuthenticationProvider实现类:是AuthenticationManager中管理的其中一个Provider,因为是要访问数据库,所以叫Dao

准备

利用idea生成一个SpringBoot工程,然后加入Spring web、SpringSecurity依赖即可,直接以Debug模式启动启动类,并在下图中打入断点


3.1 第一步

 

通过浏览器提交用户名密码

 
3.2 第二步

默认的登录是用UsernamepasswordAuthencitionFilter过滤器去拦截

通过Authentication接口的实现子类UsernamePasswordAuthenticationToken封装Authentication对象,这里只有用户名和密码,还没有权限

 

 


3.3 第三步

 

调用AuthenticationManager的authenticate方法进行认证

因为AuthenticationManager中管理了一群Provider,所以调用的就是那一群Provider的authenticate方法进行认证

调用DaoAuthenticationProvider的authenticate方法进行认证

 

DaoAuthenticationProvider是AuthenticationProvider接口的其中一个实现类


3.4 第四步

 

调用DaoAuthenticationProvider的authenticate方法进行认证


3.5 第五步

 

获得DaoAuthenticationProvider的UserDetailService对象,再调用此对象的loadUserByUsername方法查询用户信息


总结

上面五步就是SpringSecurity的基本认证流程,其实从基本认证流程中不难看出,我们可以重写或者替换UsernamePasswordAuthenticationFilter过滤器,用以添加我们需要的业务处理逻辑,并且可以实现UserDetailsService接口,加入Spring Data JPA或者Mybatis用来访问数据库中的用户信息
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值