Authentication
AuthenticationProvider
每一个AuthenticationProvider对应一个Authentication
很多个AuthenticationProvider 由一个 ProviderManager管理
ProviderManager
implements AuthenticationManager
一个ProviderManager有很多个 AuthenticationProvider
UsernamePasswordAuthenticationFilter
用户名密码登录 进入的 Filter ,,他的父类AbstractAuthenticationProcessingFilter
DaoAuthenticationProvider
父类是AbstractUserDetailsAuthenticationProvider
这里的retrieveUser() 会返回数据库中 找到的 UserDetails 对象。。。就是UserDetailsService#loadUserByUsername 获取的对象
在 AccountStatusUserDetailsChecker#check方法校验用户其他属性
在DaoAuthenticationProvider#additionalAuthenticationChecks 校验密码
Authenticate#getPrincipal 根据自己的Provider设置
自定义AuthenticationProvider
默认使用 DaoAuthenticationProvider 去校验,也可以自定义自己的Provider交给 ProviderManager去管理
比如: 添加短信验证码,,图形验证码
自定义过滤器,,一般来说放在UsernamePasswordAuthenticationFilter 过滤器的前面,,每次请求都会 过这个过滤器,,但实际上,只需要登录的时候再去过那个验证码过滤器就行了,,
但是,,怎么只让登录请求经过这个过滤器呢,其他请求不进入,,
自己写AuthenticationProvider, 并在这里面写验证码的校验,,交给 AuthenticationManager管理
- 写自己的Provider
- 在配置文件中配置
github:https://github.com/water-kid/spring-security/tree/master/springsecurity-mybatis