🌸🌸 pig 登录验证 🌸🌸
一、大概执行顺序,便于理解
pig
spring-security
二、执行过程分析
- 请求拦截:
- 当客户端发送请求时,
Spring Security
的过滤器链会首先拦截该请求。过滤器链中的每个过滤器都会依次处理请求。
- 当客户端发送请求时,
SecurityContextHolder
初始化:SecurityContextHolder
是一个静态容器,用于存储当前的安全上下文信息,包括当前的认证对象Authentication
。在请求开始时,SecurityContextHolder
通常是空的。
- 认证请求过滤:
- 请求到达
UsernamePasswordAuthenticationFilter
或其他自定义认证过滤器。这个过滤器会捕获提交的用户名和密码,并创建一个UsernamePasswordAuthenticationToken
。
- 请求到达
AuthenticationManager
认证:UsernamePasswordAuthenticationToken
会被传递给AuthenticationManager
进行认证。AuthenticationManager
通常会委托给ProviderManager
来处理。ProviderManager
会迭代一组AuthenticationProvider
实现来进行实际的认证。最常见的实现是DaoAuthenticationProvider
,它会使用UserDetailsService
来加载用户详细信息并进行验证。
UserDetailsService
加载用户信息:UserDetailsService
从数据库或其他持久化存储中加载用户信息,并返回一个UserDetails
对象。这个对象包含了用户名、密码、权限等信息。DaoAuthenticationProvider
然后会比较提交的密码和UserDetails
中存储的密码(通常会进行加密或哈希比较)。
- 成功认证:
- 如果认证成功,
AuthenticationManager
会返回一个已认证的Authentication
对象,并将其存储在SecurityContextHolder
中。 UsernamePasswordAuthenticationFilter
处理成功后,会将认证信息存储到SecurityContext
中,并继续处理请求链。- 客户端通常会收到一个
JWT
或其他形式的认证令牌,用于后续请求的认证。
- 如果认证成功,
- 失败处理:
- 如果认证失败,
AuthenticationManager
会抛出一个AuthenticationException
。 UsernamePasswordAuthenticationFilter
会捕获异常并调用配置的AuthenticationFailureHandler
来处理认证失败的情况,通常返回401
未授权响应。
- 如果认证失败,
- 访问受保护资源:
- 在后续请求中,客户端会使用之前收到的认证令牌。
SecurityContextPersistenceFilter
会检查SecurityContextHolder
,并确保上下文中包含认证信息。AbstractSecurityInterceptor
会拦截受保护的资源请求,检查用户的权限。如果用户有权限访问资源,请求会被允许通过;否则,将返回403
禁止访问响应。