🌸🌸 pig 登录验证 🌸🌸
pig后端源码
一、大概执行顺序,便于理解
pig
spring-security
二、配置过滤器
- 配置
SecurityFilterChain
三、执行过程分析
-
请求拦截:
- 当客户端发送请求时,
Spring Security
的过滤器链会首先拦截该请求。过滤器链中的每个过滤器都会依次处理请求。
- 当客户端发送请求时,
-
SecurityContextHolder
初始化:SecurityContextHolder
是一个静态容器,用于存储当前的安全上下文信息,包括当前的认证对象Authentication
。在请求开始时,SecurityContextHolder
通常是空的。
-
认证请求过滤:
- 请求到达
UsernamePasswordAuthenticationFilter
或其他自定义认证过滤器。这个过滤器会捕获提交的用户名和密码,并准备将request
转换为一个UsernamePasswordAuthenticationToken
。
- 请求到达
-
🌸🌸
AuthenticationManager
认证: 🌸🌸- 这里是最重要的认证授权部分,使用
AuthenticationProvider
、AuthenticationConverter
组装token
UsernamePasswordAuthenticationToken
会被传递给AuthenticationManager
进行认证。AuthenticationManager
通常会委托给ProviderManager
来处理。ProviderManager
会迭代一组AuthenticationProvider
实现来进行实际的认证。最常见的实现是DaoAuthenticationProvider
,它会使用UserDetailsService
来加载用户详细信息并进行验证。
- 这里是最重要的认证授权部分,使用
- 自定义模式认证转换器-密码认证转换器
OAuth2ResourceOwnerBaseAuthenticationConverter
-OAuth2ResourceOwnerPasswordAuthenticationConverter
- 通过
checkParams()
、support()
、buildToken()
将request
转换为自定义的token:Authentication
,如:OAuth2ResourceOwnerPasswordAuthenticationToken
- 自定义授权-处理用户名密码授权
OAuth2ResourceOwnerBaseAuthenticationProvider
-OAuth2ResourceOwnerPasswordAuthenticationProvider
AuthenticationProvider
拿到转换的token
,使用AuthenticationManager
进行验证
- 自定义授权模式抽象-密码授权
token
信息
-
UserDetailsService
加载用户信息:UserDetailsService
从数据库或其他持久化存储中加载用户信息,并返回一个UserDetails
对象。这个对象包含了用户名、密码、权限等信息。- 这里使用
PigUserDetailsService
extendsUserDetailsService
- 这里使用
DaoAuthenticationProvider
然后会比较提交的密码和UserDetails
中存储的密码(通常会进行加密或哈希比较)。- 这里使用
PigDaoAuthenticationProvider
extendsAbstractUserDetailsAuthenticationProvider
,重载了一些方法,如additionalAuthenticationChecks()
自定义密码验证,retrieveUser()
获取人员,createSuccessAuthentication()
成功后创建Authentication
- 父级的
AbstractUserDetailsAuthenticationProvider
implementsAuthenticationProvider
- 父级的
- 这里使用
-
成功认证:
- 如果认证成功,
AuthenticationManager
会返回一个已认证的Authentication
对象,并将其存储在SecurityContextHolder
中。 - 此处构建
OAuth2AccessToken
,OAuth2RefreshToken
,详情查看这篇文章:token令牌生成(generate)过程 UsernamePasswordAuthenticationFilter
处理成功后,会将认证信息存储到SecurityContext
中,并继续处理请求链。- 客户端通常会收到一个
token
或其他形式的认证令牌,用于后续请求的认证。
- 如果认证成功,
-
失败处理:
- 如果认证失败,
AuthenticationManager
会抛出一个AuthenticationException
。 UsernamePasswordAuthenticationFilter
会捕获异常并调用配置的AuthenticationFailureHandler
来处理认证失败的情况,通常返回401
未授权响应。
- 如果认证失败,
-
访问受保护资源:
- 在后续请求中,客户端会使用之前收到的认证令牌。
SecurityContextPersistenceFilter
会检查SecurityContextHolder
,并确保上下文中包含认证信息。AbstractSecurityInterceptor
会拦截受保护的资源请求,检查用户的权限。如果用户有权限访问资源,请求会被允许通过;否则,将返回403
禁止访问响应。