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

  • Post author:
  • Post category:其他




一、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.



版权声明:本文为m0_46638350原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。