有关Spring Security与JWT相关知识可以看我之前写的文章:SpringBoot整合SpringSecurity+JWT(三更草堂)
这边需要对RBAC模型有一点了解,比较简单可自行百度。
首先查看Security配置类SecurityConfig,如果我们想要放行自己写的接口是可以在此配置,也可以加上@Anonymous注解
这里区分一下下面两个方法:
anonymous() 允许匿名用户访问,不允许已登入用户访问
permitAll() 不管登入,不登入 都能访问
我们来分析一下这个注解@Anonymous注解
这是个自定义注解,我们去查看切面处理逻辑,这里需要spring启动流程与bean生命周期相关知识。
可以看到这里实现了InitializingBean()接口,然后重写当中的afterPropertiesSet()方法,同时该类加上了@Configuration注解。我们可以了解到在项目启动后,会把所有加上@Anonymous注解的路径放入了urls集合,并且在配置类当中进行了配置。不了解spring启动流程与bean生命周期的同学可以查看我之前写的文章:手写简易Spring框架
这里还添加了JWT的过滤链,
Spring Security本身就是一堆过滤器的组合,我们可以查看JWT过滤器链条的位置。
在过滤器链当中我们还存入了用户信息到SecurityContextHolder,SecurityContextHolder使用了ThreadLocal机制来保存每个使用者的安全上下文。ThreadLocal 叫做本地线程变量,是个非常重要的知识点读者可自行了解因此我们才能在SecurityUtils工具了方便的在需要的地方获取用户信息。