在之前章节只是分析过滤器,并没有仔细地去分析认证这一块。现在我们来仔细分析一下认证详细流程。
认证时序图
UsernamePasswordAuthenticationFilter 过滤器会调用 attemptAuthentication 方法进行认证。在 attemptAuthentication 方法内部会根据传递进来的 username 和 password 封装成 UsernamePasswordAuthenticationToken 对象,并由 AuthenticationManager 管理器调用 authenticate 方法进行认证。AuthenticationManager 管理器会把具体认证工作委派给 ProviderManager 。由 ProviderManager 类来完成加载用户信息、检查用户状态、密码比对等等,如果认证成功,会生产 Authentication 对象并返回。大致的时序图如下所示。

AuthenticationProvider
AuthenticationProvider 的实现类才是真正执行完成认证逻辑的地方,多个 AuthenticationProvider 可以被注入到 ProviderManager 类中。每个 AuthenticationProvider 都对应不同认证方式。例如 DaoAuthenticationProvider 支持用户名和密码进行认证;JwtAuthenticationProvider 支持JWT进行认证。
public interface AuthenticationProvider {
Authentication authenticate(Authentication var1) throws AuthenticationException;
// 是否支持该认证方式
boolean supports(Class<?> var1);
}
DaoAuthenticationProvider认证流程
AbstractUserDetailsAuthenticationProvider 类会调用 authenticate 方法,然后根据参数 Authentication 对象获取用户名。根据用户名从缓存获取 UserDetails 对象,如果获取不到,则委派 UserDetailsService 类加载用户信息。然后对用户信息执行 preAuthenticationChecks、additionalAuthenticationChecks、postAuthenticationChecks 校验,如果都通过,则放入缓存并创建新的 Authentication 对象。

ProviderManager
ProviderManager 是认证管理器,它可以配置多种认证方式,而且还可以配置父类认证管理器。首先遍历集合 providers ,然后判断认证器是否支持该认证方式。如果支持,则由 provider 进行认证。如果认证结果为空,则调用父类的认证器集合进行认证,直到返回认证结果或者抛出异常。最后,如果需要进行凭证清除,就把凭证设置为空,防止凭证泄漏。

类图

备注
本系列都是学习《深入浅出Spring Security》的笔记
本文深入分析了Spring Security的认证过程,包括AuthenticationProvider、DaoAuthenticationProvider的认证流程和ProviderManager的工作机制。通过时序图和类图,阐述了过滤器如何调用AuthenticationManager进行认证,以及AuthenticationProvider如何完成加载用户信息、密码比对等步骤,帮助读者理解Spring Security的认证机制。
1万+

被折叠的 条评论
为什么被折叠?



