🌸🌸 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-OAuth2ResourceOwnerPasswordAuthenticationProviderAuthenticationProvider拿到转换的token,使用AuthenticationManager进行验证

- 自定义授权模式抽象-密码授权
token信息

-
UserDetailsService加载用户信息:UserDetailsService从数据库或其他持久化存储中加载用户信息,并返回一个UserDetails对象。这个对象包含了用户名、密码、权限等信息。- 这里使用
PigUserDetailsServiceextendsUserDetailsService
- 这里使用
DaoAuthenticationProvider然后会比较提交的密码和UserDetails中存储的密码(通常会进行加密或哈希比较)。- 这里使用
PigDaoAuthenticationProviderextendsAbstractUserDetailsAuthenticationProvider,重载了一些方法,如additionalAuthenticationChecks()自定义密码验证,retrieveUser()获取人员,createSuccessAuthentication()成功后创建Authentication- 父级的
AbstractUserDetailsAuthenticationProviderimplementsAuthenticationProvider



- 父级的
- 这里使用
-
成功认证:
- 如果认证成功,
AuthenticationManager会返回一个已认证的Authentication对象,并将其存储在SecurityContextHolder中。 - 此处构建
OAuth2AccessToken,OAuth2RefreshToken,详情查看这篇文章:token令牌生成(generate)过程 UsernamePasswordAuthenticationFilter处理成功后,会将认证信息存储到SecurityContext中,并继续处理请求链。- 客户端通常会收到一个
token或其他形式的认证令牌,用于后续请求的认证。




- 如果认证成功,
-
失败处理:
- 如果认证失败,
AuthenticationManager会抛出一个AuthenticationException。 UsernamePasswordAuthenticationFilter会捕获异常并调用配置的AuthenticationFailureHandler来处理认证失败的情况,通常返回401未授权响应。

- 如果认证失败,
-
访问受保护资源:
- 在后续请求中,客户端会使用之前收到的认证令牌。
SecurityContextPersistenceFilter会检查SecurityContextHolder,并确保上下文中包含认证信息。AbstractSecurityInterceptor会拦截受保护的资源请求,检查用户的权限。如果用户有权限访问资源,请求会被允许通过;否则,将返回403禁止访问响应。