SpringSecurity系列——认证架构day2-3(源于官网5.7.2版本)
- 前言
- Authentication(认证)
- Servlet身份认证架构
前言
源于官方最新5.7.2文档,若你觉得官方文档阅读起来很枯燥,内容复杂,我提供了解析概括在每个部分的结尾,我对官方文档的内容做了一些改变,实例代码我会在后续进行更新,请查看如:SpringSecurity系列——认证架构实例代码的文章
但是如果你有能力,还是推荐直接阅读官方文档
Authentication(认证)
身份验证的目的
身份验证在 Spring Security 中有两个主要目的:
-
AuthenticationManager 的输入,用于提供用户提供的身份验证凭据。 在这种情况下使用时,isAuthenticated() 返回 false。
-
表示当前经过身份验证的用户。 当前的Authentication可以从SecurityContext中获取。
身份验证包含:
- 主体 - 标识用户。 当使用用户名/密码进行身份验证时,这通常是 UserDetails 的一个实例。
- 凭据 - 通常是密码。 在许多情况下,这将在用户通过身份验证后被清除,以确保它不被泄露。
- authority - GrantedAuthoritys 是授予用户的高级权限。 一些示例是角色或范围。
授权
Servlet身份认证架构
-
SecurityContextHolder - SecurityContextHolder 是 Spring Security 存储身份验证者详细信息的地方。
-
SecurityContext - 从 SecurityContextHolder 中获取,包含当前经过身份验证的用户的身份验证。
-
身份验证 - 可以是 AuthenticationManager 的输入,以提供用户提供的用于身份验证的凭据或来自 SecurityContext 的当前用户。
-
GrantedAuthority - 在身份验证上授予主体的权限(即角色、范围等)
-
AuthenticationManager - 定义 Spring Security 的过滤器如何执行身份验证的 API。
-
ProviderManager - AuthenticationManager 最常见的实现。
-
AuthenticationProvider - ProviderManager 使用它来执行特定类型的身份验证。
-
Request Credentials with AuthenticationEntryPoint - 用于从客户端请求凭据(即重定向到登录页面、发送 WWW-Authenticate 响应等)
-
AbstractAuthenticationProcessingFilter - 用于身份验证的基本过滤器。 这也很好地了解了身份验证的高级流程以及各个部分如何协同工作。
SecurityContextHolder(安全上下文持有者)
Spring Security 认证模型的核心是 SecurityContextHolder。 它包含 SecurityContext。
SecurityContextHolder 是 Spring Security 存储身份验证者详细信息的地方。 Spring Security 不关心 SecurityContextHolder 是如何填充的,如果它包含一个值,则将其用作当前经过身份验证的用户。
指示用户已通过身份验证的最简单方法是直接设置SecurityContextHolder
设置SecurityContextHolder
SecurityContext context = SecurityContextHolder.createEmptyContext();
Authentication authentication =
new TestingAuthenticationToken("username", "password",