【Spring Security第二篇】身份认证Authentication

一、Authentication架构的基本概念

SecurityContextHolder
SecurityContextHolder中包含了SecurityContext对象,SecurityContext中包含了Authentication对象
在这里插入图片描述
Authentication

一、两个功能
1. 作为后续验证的入参
2. 获取当前验证通过的用户信息

二、三个属性
1. principal:用户身份,如果是用户/密码认证,这个属性就是UserDetails实例
2. credentials:通常就是密码,在大多数情况下,在用户验证通过后就会被清除,以防密码泄露。
3. authorities:用户权限

AuthenticationManager

1. AuthenticationManager最常用的子类是ProviderManager,参数为Authentication
2. ProviderManager管理各种AuthenticationProvider,根据不同的Authentication调用不用的AuthenticationProvider
3. AuthenticationProvider是某种具体的认证实现
	(1) DaoAuthenticationProvider实现用户/密码认证,处理UsernamePasswordAuthenticationToken类型的Authentication。
	(2) JwtAuthenticationProvider实现JWT Token认证

AbstractAuthenticationProcessingFilter
在这里插入图片描述

1. AbstractAuthenticationProcessingFilter使用来进行用户认证的过滤器,会编排进SecurityFilterChain中
2. 用户提交信息后,AbstractAuthenticationProcessingFilter或从HttpServletRequest提取信息并创建Authentication
	(1) Authentication的类型是由过滤器的类型决定的
	(2) 例如UsernamePasswordAuthenticationFilter创建UsernamePasswordAuthenticationToken
3. 创建出来的Authentication被传入AuthenticationManager进行认证
	(1) 如果认证失败:
			a. SecurityContextHolder 清除掉
			b. RememberMeServices.loginFail 被调用,如果remember me 没有配置,则此方法为空方法
			c. AuthenticationFailureHandler 被调用

	(2) 如果认证成功:
			a. SessionAuthenticationStrategy 被通知用户登陆.
			b. Authentication 存入 SecurityContextHolder. 之后 SecurityContextPersistenceFilter 会将SecurityContext存入HttpSession.
			c. RememberMeServices.loginSuccess 被调用,如果remember me没有配置,则改方法为空方法
			d. ApplicationEventPublisher 发布 InteractiveAuthenticationSuccessEvent.

DaoAuthenticationProvider
假设上图中经过SecurityFilterChain后,生成的Authentication类型是UsernamePasswordAuthenticationToken,并且AuthenticationManager根据Authentication类型提供DaoAuthenticationProvider验证,具体验证流程如下。
在这里插入图片描述

1. SpringSecurity生成的UsernamePasswordAuthenticationToken传送给AuthenticationManager中
2. AuthenticationManager的子类根据Authentication的类型UsernamePasswordAuthenticationToken调用DaoAuthenticationProvider实现账号密码认证
3. DaoAuthenticationProvider 调用UserDetailsService得到UserDetails对象,UserDetails通过set方法得到的密码
4. DaoAuthenticationProvider 调用PasswordEncoder对传入的密码进行加密,并与上一步得到的UserDetails中的密码进行比较
5. DaoAuthenticationProvider 调用PasswordEncoder对传入的密码进行加密,并与上一步得到的UserDetails中的密码进行比较

二、Authentication架构的执行流程

1. 用户现在登录一个具有Spring Security Authentication的网站,输入了账号密码。
2. 账号密码通过SecurityFilterChain过滤链,生成了一个UsernamePasswordAuthenticationToken类型的Authentication
3. Authentication 被传入AuthenticationManager的子类ProviderManager
4. ProviderManager根据UsernamePasswordAuthenticationToken类型的Authentication调用DaoAuthenticationProvider实现认证
5. DaoAuthenticationProvider 调用UserDetailsService得到UserDetails对象,UserDetails通过set方法得到的密码
6. DaoAuthenticationProvider 调用PasswordEncoder对传入的密码进行加密,并与上一步得到的UserDetails中的密码进行比较
7. DaoAuthenticationProvider 调用PasswordEncoder对传入的密码进行加密,并与上一步得到的UserDetails中的密码进行比较
	(1) 如果认证失败:
			a. SecurityContextHolder 清除掉
			b. RememberMeServices.loginFail 被调用,如果remember me 没有配置,则此方法为空方法
			c. AuthenticationFailureHandler 被调用

	(2) 如果认证成功:
			a. SessionAuthenticationStrategy 被通知用户登陆.
			b. Authentication 存入 SecurityContextHolder. 之后 SecurityContextPersistenceFilter 会将SecurityContext存入HttpSession.
			c. RememberMeServices.loginSuccess 被调用,如果remember me没有配置,则改方法为空方法
			d. ApplicationEventPublisher 发布 InteractiveAuthenticationSuccessEvent.

猜你喜欢

转载自blog.csdn.net/m0_46638350/article/details/130480254