[toc]
![architecture](https://box.kancloud.cn/bfd8826ca3acad751c3addb5ba555128_1024x768.png)
## 1.接收请求
Spring安全性有一系列/过滤器链。 因此,当请求到来时,它将通过一系列过滤器进行身份验证和授权。 当存在用户认证请求时,它也将像往常一样通过过滤器链,直到它根据认证机制/模型找到相关的认证过滤器。
例如: -
HTTP基本身份验证请求通过过滤器链直到它到达BasicAuthenticationFilter。
HTTP摘要式身份验证请求通过过滤器链,直到它到达DigestAuthenticationFilter。
登录表单提交请求(登录表单身份验证请求)通过过滤器链直到它到达UsernamePasswordAuthenticationFilter。
x509身份验证请求通过过滤器链直到它到达X509AuthenticationFilter等...
## 2.根据用户凭据创建AuthenticationToken
一旦相关的AuthenticationFilter收到身份验证请求,它就会从收到的请求中提取用户名和密码(大多数身份验证机制都需要用户名和密码)。 之后,它会根据提取的用户凭据创建一个Authentication对象。
如果提取的凭据是用户名和密码,则将使用提取/找到的用户名和密码创建UsernamePasswordAuthenticationToken。
## 3.创建的AuthenticationToken委派给AuthenticationManagager
创建UsernamePasswordAuthenticationToken对象后,它将用于调用AuthenticationManager的authenticate方法。 AuthenticationManager只是一个接口,实际的实现是ProviderManager。
~~~
public interface AuthenticationManager
{
Authentication authenticate(Authentication authentication)throws AuthenticationException;
}
~~~
ProviderManager有一个配置的AuthenticationProvider列表,应该用于验证用户请求。 ProviderManager将遍历每个提供的AuthenticationProvider,并尝试根据传递的Authentication Object对用户进行身份验证(例如: - UsernamePasswordAuthenticationToken)
## 4.尝试使用AuthenticationProvider列表进行身份验证
AuthenticationProvider尝试使用提供的身份验证对象对用户进行身份验证。
~~~
public interface AuthenticationProvider {
Authentication authenticate(Authentication authentication) throws AuthenticationException;
boolean supports(Class<?> authentication);
}
~~~
以下是框架附带的一些现有身份验证程序:
* CasAuthenticationProvider
* JaasAuthenticationProvider
* DaoAuthenticationProvider
* OpenIDAuthenticationProvider
* RememberMeAuthenticationProvider
* LdapAuthenticationProvider
## 5.需要UserDetailsService吗
一些AuthenticationProvider可以使用UserDetailsService根据用户名检索用户详细信息。 (例如: - DaoAuthenticationProvider)
~~~
public interface UserDetailsService
{
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
~~~
## 6和7. UserDetails 还是 User Object?
UserDetailsService将根据用户名检索UserDetails(实际实现是User)。
## 8.Authentication 对象 还是 AuthenticationException?
如果用户成功通过身份验证,则将返回完全填充的Authentication对象。 否则将抛出AuthenticationException。
**完全填充的验证对象**
经过身份验证 - 是的
授权列表
用户凭据(仅限用户名)
如果抛出任何AuthenticationException,那将由支持身份验证机制的已配置AuthenticationEntryPoint处理。
## 9.验证完成!
AuthenticationManager将获取的完全填充的Authentication对象返回到相关的Authentication 过滤器。
## 10.在SecurityContext中设置Authentication对象
然后,相关的AuthenticationFilter会将获取的身份验证对象存储在SecurityContext中,以供将来过滤器使用。 (用于授权过滤器)
`SecurityContextHolder.getContext().setAuthentication(authentication);`
希望这将有助于您在一定程度上深入了解Spring Security身份验证体系结构。
- 架构
- 9.技术概述
- 9.1 运行环境
- 9.2 核心组件
- 9.2.1 SecurityContextHolder, SecurityContext and Authentication Objects
- 9.2.2 The UserDetailsService
- 9.2.3 GrantedAuthority
- 9.2.4 总结
- 9.3 验证
- 9.3.1 在Spring Security中验证是什么
- 9.3.2 直接设置SecurityContextHolder内容
- 9.4 web应用中的验证
- 9.4.1 ExceptionTranslationFilter
- 9.4.2 AuthenticationEntryPoint
- 9.4.3 验证机制
- 9.4.4 在请求之间存储SecurityContext
- 9.5 Spring Security中的访问控制(授权)
- 9.5.1 Security and AOP Advice
- 9.5.2 Secure Objects and the AbstractSecurityInterceptor
- 什么是配置属性
- RunAsManager
- AfterInvocationManager
- 扩展安全对象模型
- 9.6 本地化
- 10 核心服务
- 10.1 The AuthenticationManager, ProviderManager and AuthenticationProvider
- 10.1.1 成功验证时擦除凭据
- 10.1.2 DaoAuthenticationProvider
- 10.2 UserDetailsService实现
- 10.2.1 In-Memory Authentication
- 10.2.2 JdbcDaoImpl
- Authority Groups
- 10.3 Password Encoding
- 10.3.1 密码发展史
- 10.3.2 DelegatingPasswordEncoder
- 密码存储格式
- 密码编码
- 密码比对
- 入门体验
- 排除故障
- 10.3.3 BCryptPasswordEncoder
- 10.3.4 Pbkdf2PasswordEncoder
- 10.3.5 SCryptPasswordEncoder
- 10.3.6 其他PasswordEncoders
- 10.4 Jackson的支持
- 11 测试方法安全
- 12 集成spring mvc测试
- 13 webflux支持
- 14 安全过滤器链
- 14.1 DelegatingFilterProxy
- 14.2 FilterChainProxy
- 14.2.1 绕过过滤链
- 14.3 过滤器顺序
- 14.4 匹配请求和http防火墙
- 14.5 与其他基于过滤器的框架一起使用
- 14.6 Advanced Namespace Configuration
- 15. 核心的安全过滤器
- 15.1 FilterSecurityInterceptor
- 15.2 ExceptionTranslationFilter
- 15.3 SecurityContextPersistenceFilter
- 15.4 UsernamePasswordAuthenticationFilter