认证流程图
认证解析
用户发起认证
经过UsernamePasswordAuthenticationFilter
,调用其父类AbstractAuthenticationProcessingFilter
的doFilter()方法
调用UsernamePasswordAuthenticationFilter
的attemptAuthentication()方法尝试进行认证
将新构建的未认证的token(Authentication)交给AuthenticationManager接口的子类进行认证
认证管理器处理认证
AuthenticationManager
本身不包含任何的认证逻辑,其核心是管理所有的AuthenticationProvider
,本质上认证是由AuthenticationProvider
来实现认证。
用户认证调用了AuthenticationManager
的authenticate()方法,由此进入 AbstractUserDetailsAuthenticationProvider(AuthenticationManager的实现类)的authenticate()方法
1 2 3 4 5 6 7 8 9 10 11 12
| a.根据自定义方式获取数据库用户信息 1.根据用户名从缓存寻找用户信息 2.没有缓存,调用子类DaoAuthenticationProvider.retrieveUser()->调用userDetailService的loadUserByUsername()走我们自定义的查询用户方法返回用户信息 b.校验用户状态(前置校验、额外校验、后置校验) 3.preAuthenticationChecks.check(user)对账号状态(isAccountNonLocked、isEnabled、isAccountNonExpired)进行校验 4.additionalAuthenticationChecks(user,authenticationToken) 对其他认证信息进行检查(密码校验) 5.postAuthenticationChecks.check(user)对账号状态(isCredentialsNonExpired)进行校验 6.存在用户缓存信息的情况下需要更新缓存 c.生成用户认证信息authentication 7.createSuccessAuthentication()返回Authentication
|
a.根据自定义方式获取数据库用户信息,如下图:
b.校验用户状态(前置校验、额外校验、后置校验)
c.生成用户认证信息authentication
认证成功、失败handler
最后认证信息会传回UsernamePasswordAuthenticationFilter
,并在其父类AbstractAuthenticationProcessingFilter
的doFilter()
中,根据认证成功设置SecurityContextHolder安全上下文用户信息,失败清除上下文用户信息,并设置调用相应的handler
。
总结
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 1.自定义登录过滤器 不同的登录形式我们可以继承AbstractAuthenticationProcessingFilter定义自己的登录过滤器(默认UsernamePasswordAuthenticationFilter) 根据指定的url匹配到该过滤器,目的是生成自定义继承AbstractAuthenticationToken的子类token(默认UsernamePasswordAuthenticationToken)
2.认证管理器 调用环境指定的认证管理器对未认真的Authentication进行认证处理(默认ProviderManager)
3.覆写provider、abstractAuthenticationToken、userDetailServicec 实现AuthenticationProvider自定义自己的provider(默认DaoAuthenticationProvider),认证管理器根据我们重写的public boolean supports(Class<?> authentication)方法对当前环境的authentication进行判断,选取合适我的provider进行认证处理 provider会调用自定义的userDerailService查询用户信息进行校验
4.覆写成功、失败的handler 认证期间,失败,会抛出对应的异常;成功,则生成已认证的Authentication返回 覆写AuthenticationFailureHandler、AuthenticationSuccessHandler可以在认证成功或失败时进行自定义处理
|