赞
踩
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中的密码进行比较
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.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。