之前写过一篇关于spring security简单介绍的文档,但是总觉得对security还没有真正的了解!借着工作不忙时,又重新研究了一遍,以下把我研究的成果分享一下!
之前已经介绍过spring security是一个关于权限的一个框架!它的核心就是Filter,就是利用各个Filte进行用户的校验以及权限的控制!!!!
首先介绍spring security自带的Filter:
![](https://img.haomeiwen.com/i9487719/5a0f4a3f89c33a62.png)
以上图片截取自spring seccurity 官方文档:
https://docs.spring.io/spring-security/site/docs/5.0.0.M1/reference/htmlsingle/#ns-custom-filters
图上的所有Filter都是security自带的,默认的执行顺序也是从上到下顺序执行!至于是怎么控制的,下面会有介绍!
问题1:security 自带的Filter如何启动,以及什么时候执行?
我们都知道,要使用security 会用到一个实现了WebSecurityConfigurerAdapter的配置类(以下是我的配置类);
![](https://img.haomeiwen.com/i9487719/82821e523a0bbf70.png)
首先spring security 自带的Filter 是通过http对象配置的(绿色部分),具体如何配置请看上面的截图;
例如:
http.requiresChannel() 会把ChannelProcessingFilter 加入到FilterChain中;
http.formLogin().loginPage("/login").defaultSuccessUrl("/user") 会把UsernamePasswordAuthenticationFilter 加入到FilterChain中;
SecurityContextPersistenceFilter 默认会自动加入FilterChain中;
这样你想使用哪儿些Filter,就可以自行配制了,如果自带的Filter不满足你的需求,你也可以加入自己的Filter(如何加入自定义的Filter下章节讲)
理解这一点很重要!!!如果这个弄明白了,spring security就理解一大半了,我之前就是这块没搞清除,所以一直感觉理解不透彻!
其实spring security 默认配置了一些Filter,具体看源码:
![](https://img.haomeiwen.com/i9487719/15979e3ab208306a.png)
以上可以看出,spring security 除了自带Filter外,默认配置了UsernamePasswordAuthenticationFilter 和 BasicAuthenticationFilter 这就是为什么你什么也没有配置,登陆时就会走UsernamePasswordAuthenticationFilter 的原因(我上一章节将的大体流程就是基于这个讲解的);
红色部分:为我测试security Filter执行顺序使用到的,你也可以自己debug试试,看看哪儿些Filter会执行;
以上如果理解了,我认为基于spring security实现用户的登陆功能已经没有问题了;
问题2:security 如何进行权限控制?
之前已经说了,spring security 最主要的就是Filter,那么控制权限也是由Filter完成的;
FilterSecurityInterceptor:(就是主要控制权限的Filer)
通过源码跟踪,访问受保护的资源都会走到这里:
![](https://img.haomeiwen.com/i9487719/dc708e538af406f6.png)
绿色源码部分:
![](https://img.haomeiwen.com/i9487719/397a9153d987315d.png)
从截图可以看出如果attributes不为null时(如果为null则说明该资源公开访问)是调用了AbstractAccessDecisionManager 实现类的decide(authenticated, object, attributes)实现的权限控制;继续跟代码....
通过debug得知最终调用了AffirmativeBased类的decide(authenticated, object, attributes)
![](https://img.haomeiwen.com/i9487719/35bdc0b9535a278a.png)
继续跟....
![](https://img.haomeiwen.com/i9487719/01cbc8d59ff3a6b3.png)
终于要见亮了,原来最终判定权限的是绿色部分这行代码;继续吧.....
![](https://img.haomeiwen.com/i9487719/7ef71c64d5ae357e.png)
终于要看到真面目了。。。。
![](https://img.haomeiwen.com/i9487719/ff1f012d4dd75867.png)
1.是验证通过用户的一些信息,包括用户名和用户权限
2.为资源访问的url
3.为该资源需要的权限
然后就很简单喽~经过简单的比较就可以知道该用户是否有权限访问该资源了!
基于以上跟踪源码画一个简单的流程图:
![](https://img.haomeiwen.com/i9487719/f7b7005ba53fd5c1.png)
参考文章:
https://blog.csdn.net/shenchaohao12321/article/details/87355803
网友评论