0%

spring security 认证

认证流程图

认证解析

用户发起认证

​ 经过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,并在其父类AbstractAuthenticationProcessingFilterdoFilter()中,根据认证成功设置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可以在认证成功或失败时进行自定义处理