宽容是谅解,忍耐是蛰伏
一个比喻:spring security 很强大,很复杂,就像政府的行政服务中心,但是好在我们不会所有的业务办理都需要,我们只要关注我们需要的就行了。选择需要的服务,无视那些不需要的,等有需要再去了解。
一直理念:java 体系异常庞大,别动不动就精通,撸遍掩码说明的,人生苦短。
1. 关于认证 authentication 和关于authorization认证是什么,认证的目的是确认用户存在,本质就是对比用户名和密码。
授权是确定用户存在后,用户可以干什么,干什么就可能对应到角色,角色粒度太大,就可能再缩小到 操作。
permit
n 许可证;执照
v 允许,许可
JAVAEE 的流程 本质户以上股Filter过滤请求,转发到不同的处理模板处理,最后经过业务逻辑处理,返回Response的过程。
2.UsernamePasswordAuthenticationFilter 的简单理解用户输入username和password
发起请求,进入 UsernamePasswordAuthenticationFilter 处理器
attempt
英 [əˈtempt] 美 [əˈtempt]
n.
企图;试图;尝试;杀人企图;(为超越某事物的)尝试,努力
v.
努力;尝试;试图
尝试认证 attemptAuthentication
过滤器的工作:
- 匹配URL和Method 必须是POST
- 从request请求中获得username和password
- 我们不知道用户名和密码是不是对的,所以我们先构造一个未征得Token对象(UsernamePasswordAuthenticationToken 对象)
- 存储这个token对象
- 把token对象传个AuthenticationManager 去认证
未认证的token和认证的token 有什么区别?Token 对象的样子(属性和方法)
UsernamePasswordAutenticationToken 用于保存 认证的标识。它就是一个载体对象(为什么java那么喜欢把一切的东西封装成对象?)
3. AuthenticationManager 认证管理器我们不能只有一种认证方式吧,所以我们有多种AuthenticationProvider 认证提供者,例如UsernamePassword对应的DaoAuthenticationProvider。
AuthenticationManager会注册多种AuthenticationProvider ,让我们有多种选择。
AuthentionManager怎么确定使用按个Provider呢
根据Token类型来确定用什么Provider
public interface AuthenticationProvider {
Authentication authenticate(Authentication var1) throws AuthenticationException;
boolean supports(Class> var1);
}
认证提供者 接口 ,所有的认证提供者实现都要实现这个接口,接口的supports方法,返回时一个boolean值,参数是一个Class这里就是根据Token的类来确定用什么Provider来处理
。
所以我们上面封装的未认证对象 token (UsernamePasswordAutenticationToken),传给认证管理器AuthenticationManager ,认证管理器就可以确定用哪个认证提供者来认证了
//Token给谁处理呢?当然是给当前的AuthenticationManager
return this.getAuthenticationManager().authenticate(token);
因此:我们从AuthenticationManager管理器进入 DaoAuthenticationProvider了
4. DaoAuthenticationProviderretrieve
英 [rɪˈtriːv] 美 [rɪˈtriːv]
v.
取回;索回;检索数据;扭转颓势;挽回;找回
DaoAutenticationProvider要做什么?
- 从Token中取出值 (用户名和密码)
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
}
Token这里直接是 Authentication对象了(这里应该是个接口)
- 这个token 是不是认证的呢,不知道,我们去缓存中取一下,有了就证明是认证过的了,没有的话就是查数据库了
- loadUserByUsername 这个方法就是查询用户的方法
- 查到之后就该检验密码了
- 如果认证成功系统 就做相应的Session持久化和cookie的会写操作。
参照:https://www.cnblogs.com/ymstars/p/10626786.html
5. 我们自己可以做什么-
自定义AuthenticationToken实现: 不同登录方式使用不同的token
-
自定义AuthenticationProcessingFilter实现:用来过滤指定的登录方式,生成对应的自定义AuthenticationToken实现
-
自定义AuthenticationProvider实现:针对不同登录方式提供的认证逻辑
-
自定义UserDetailsService实现:自定义用户信息查询服务
-
WebSecurityConfigurerAdapter声明:security信息配置,将前面的自定义对象注入到流程中。
【链接】SpringSecurity文章目录
https://blog.csdn.net/qq_30062125/article/details/86712329



