目录
一、UsernamePasswordAuthenticationFilter
再编写LoginUser类和UserDetailsService
前言
我们都知道实现一套Spring Security 的认证流程, 需要设计很多和类来回切换,Usertails , UsertailsService , AuthenticationManager等等, 这些类名又非常的长, 所以导致我们在写的时候,思绪混乱,不知道下一步应该写什么 ,所以今天我们就通过两张图来搞明白这个认证编码的流程
Tip:最好自己是已经跟着文档或者视频做过一次Spring Security认证流程
可以看看我的上一篇博客
图解
第一张图——原理流程图
第二张图——编码流程图(自顶向下)
剖析
一、UsernamePasswordAuthenticationFilter
我们先仔细看看原理图
这里是把我们的用户名密码传进来,用UsernamePasswordAuthenticationToken接收,
紧接着封装为authentication 对象
对应我们编码流程图 的这一块
二、UserDetailsService
多层的过滤器,嵌套调用方法,来到UserDetailsService
把前面的用户名密码也传到这里了
来到UserDetailsService,第一个方法就是loadUserByUsername, 这个方法就需要我们自己去重写,一般就是到数据库的用户表去查询用户(这里并没有验证密码是否正确), 然后匹配到用户的话就会来查询权限,返回一个UserDetails 对象;否则就抛出异常。
这里对应到我们的编码流程就是这一块
因为这里涉及到要返回一个UserDetails 类型的对象, 所以我们就需要封装这么一个对象
对应到我们的编码流程是这块
三、密码校验
返回UserDetails 对象之后, 就来到了我们的密码校验
默认的密码检验规则一般都不是我们想要的,所以这里我们要自己选中密码校验规则,
也就是我们编码流程的注入PasswordEncode Bean对象 到Java 工厂 ,return 这里就是选择密码校验规则
四、返回authentication 对象
对应我们编码流程图的这部分
五、自定义JWT 拦截器
总结
所以我们的编码流程自顶向下的方式是非常合理, 避免了反复频繁的切换类
先编写SecurityConfig 类
这里的JWT 过滤器可以先不写
再编写LoginUser类和UserDetailsService
编写认证登录接口
最后再编写JWT 过滤器
然后再回头把Config文件 的JWT 过滤拦截放在最前面