spring curity 采用 ioc 和 aop思想,基于 rvlet 过滤器实现的安全框架、为 web 请求和方法调用提供身份确认和授权处理,还提供与其他库的集成以简化其使用,避免了代码耦合,减少了大量重复代码工作。
在之前 web.xml中,我们是这样写的。
<!--springcurity核心过滤器链--> <!--springcurityfilterchain名词不能修改--> <filter> <filter-name>springcurityfilterchain</filter-name> <filter-class>org.springframework.web.filter.delegatingfilterproxy</filter-class> </filter> <filter-mapping> <filter-name>springcurityfilterchain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
在 spring boot项目之后,我们引入 spring curity依赖,什么也没做,启动项目 spring curity 就会生效,访问请求就进行了拦截。
spring boot 对于 spring curity 提供了自动化配置方案,可以使用更少的配置来使用 spring curity。
那么这个过滤器链是怎么加载和实现拦截的呢?
当 spring boot 项目启动后,curityfilterautoconfiguration类会加载 delegatingfilterproxyregistrationbean注册过滤器,名字为 springcurityfilterchain。
注意:
springcurityfilterchain名字是固定写死的。
delegatingfilterproxyregistrationbean 注册成功后,该过滤器就被加载了到了注册器中。
注册器注册了所有的过滤器后,会为每个过滤器生成 delegatingfilterproxy代理对象并注册到 ioc中 。
我们访问项目,就会进入 delegatingfilterproxy类的 dofilter方法。
delegatingfilterproxy类
本质也是一个 filter,其间接实现了 filter接口,但是在 dofilter中其实调用的从 spring 容器中获取到的代理 filter的实现类。
返回的 filterchainproxy对象。
由此可知,delegatingfilterproxy类通过 springcurityfilterchain这个名称,得到了一个 filterchainproxy过滤器,最终执行的是这个过滤器的 dofilter方法。
1)验证 springcurityfilterchain名词不能修改
查看 initdelegate方法。
filterchainproxy类
本质也是一个 filter,所以查看 dofilter方法。留意该类里面的属性。
public class filterchainproxy extends genericfilterbean { private static final log logger = logfactory.getlog(filterchainproxy.class); private static final string filter_applied = filterchainproxy.class.getname().concat(".applied"); // 过滤器链 private list<curityfilterchain> filterchains; private filterc自由工作者hainproxy.filterchainvalidator filterchainvalidator; private httpfirewall firewall;
惊不惊喜?15个过滤器都在这里了!
原来这些过滤器都被封装进 curityfilterchain对象中。
curityfilterchain类
是个接口,实现类也只有一个 defaultcurityfilterchain类
。
defaultcurityfilterchain类的构造方法,初始化了 list filters,是通过传参放进去的。
过滤器链参数是什么时候传入的?
创建 spring curity 过滤器链是交qq可爱情侣头像给 spring boot 自动配置,由 springbootwebcurityconfiguration类
创建注入。
查看 webcurityconfigureradapter类。
然后会注入 httpcurity对象,httpcurity可以理解为 spring curity 的 http核心配置,存放 spring curity 中的过滤器链、请求匹配路径等相关认证授权的重要方法。
然后开始创建 spring curity 过滤器链了,是交给 spring boot自动配置,一共有 15个过滤器。
使用 orderedfilter进行代理,并设置了order属性。
添加完成后,将这些过滤器再封装为 defaultcurityfilterchain对象。
最后通过 webcurityconfiguration配置加载 springcurityfilterchain,webcurityconfiguration中维护了curityfilterchains属性,会存放过滤器链中所有的过滤器。
总结:
spring boot 通过 delegatingfilterproxyregistrationbean注册过滤器,名字为 springcurityfilterchain,并生成 delegatingfilterproxy代理对象并注册到 ioc中。最终真正调用 filterchainproxy过滤器的 dofilter 获取到 spring curity 过滤器链。
spring curity的过滤器链在底层是封装在 curityfilterchain接口中的。
首先进入的是 onceperrequestfilter 过滤器。
onceperrequestfilter是为了确保一次请求中只通过一次filter,而不需要重复的执行。
会进入 delegatingfilterproxy代理对象中 invokedelegate方法,实际真正执行的是 filterchainproxy过滤器的 dofilter 方法。
查看 filterchainproxy过滤器中的 dofilterinternal方法。
然后首先进入filterchainproxy中的 dofilterinternal方法。
dofilterinternal方法中会调用 getfilters方法,会从过滤器链中拿出所有的拦截器。
然后创建一个 virtualfilterchain对象,一个虚拟的过滤器链,并执行其中的 dofilter 方法。使用过滤器对当前请求进行层层过滤。
最后进入到 filtercurityinterceptor过滤器中,该过滤器是过滤器链的最后一个过滤器,invoke方法中。
先调用父类的 beforeinvocation方法,之后调用 filterchain的 dofilter方法,之后调用父类的 finallyinvocation和afterinvocation方法。
在 beforeinvocation方法中,如果当前的请求没有通过认证,会抛出 access is denied异常,这个异常会被exceptiontranslationfilter过滤器处理。如果抛出的异常是 authenticationexception,则执行方法ndstartauthentication方法。
最终调用 entrypoint的 commence方法,发布异常。
1、webasyncmanagerintegrationfilter
org.springframework.curity.web.context.request.async.webasyncmanagerintegrationfilter
其主要用于集成 curitycontext到 spring异步执行机制中的 webasyncmanager。
2、curitycontextpersistencefilter
org.springframework.curity.web.context.curitycontextpersistencefilter
其主要是使用 curitycontextrepository在 ssion中保存或更新一个curitycontext,并将 curitycontext给以后的过滤器使用,来为后续 filter建立所需的上下文。curitycontext
中存储了当前用户的认证以及权限信息。
3、headerwriterfilter
org.springframework.curity.web.header.headerwriterfilter
其主要是向请求的 header中添加相应的信息,可在 http标签内部使用 curity:headers来控制。
4、csrffilter
org.springframework.curity.web.csrf.csrffilter
csrf又称跨域请求伪造
,springcurity会对所有 post请求验证是否包含系统生成的 csrf的 token信息,
如果不包含,则报错。起到防止csrf攻击的效果。
5、logoutfilter
org.springframework.curity.web.authentication.logout.logoutfilter
其主要用于实现用户退出,清除认证信息。默认匹配 url为 /logout的请求。
6、urnamepasswordauthenticationfilter
org.springframework.curity.web.authentication.urnamepasswordauthenticationfilter
其主要用于认证操作,默认匹配url为 /login且必须为post请求。
7、defaultloginpagegeneratingfilter
org.springframework.curity.web.authentication.ui.defaultloginpagegeneratingfilter
如果没有在配置文件中指定认证页面,则由该过滤器生成一个默认认证页面。
8、defaultlogoutpagegeneratingfilter
org.springframework.c游沙湖urity.web.authentication.ui.defaultlogoutpagegeneratingfi高级职业学校lter
由此过滤器可以生产一个默认的退出登录页面
9、basicauthenticationfilter
org.springframework.curity.web.authentication.www.basicauthenticationfilter
此过滤器会自动解析 http请求中头部名字为 authentication,且以 basic开头的头信息。
10、requestcacheawarefil间断点怎么判断ter
org.springframework.curity.web.savedrequest.requestcacheawarefilter
通过httpssionrequestcache内部维护了一个 requestcache,用于缓存 httprvletrequest。
11、curitycontextholderawarerequestfilter
org.springframework.curity.web.rvletapi.curitycontextholderawarerequestfilter
针对 rvletrequest进行了一次包装,使得 request具有更加丰富的 api。
12、anonymousauthenticationfilter
org.springframework.curity.web.authentication.anonymousauthenticationfilter
当 curitycontextholder中认证信息为空,则会创建一个匿名用户
存入到 curitycontextholder中。
spring curity为了兼容未登录的访问,也走了一套认证流程,只不过是一个匿名的身份。
13、ssionmanagementfilter
org.springframework.curity.web.ssion.ssionmanagementfilter
其主要用于限制同一用户开启多个会话的数量。
14、exceptiontranslationfilter
org.springframework.curity.web.access.exceptiontranslationfilter
异常转换过滤器位于整个 springcurityfilterchain的后方,用来转换整个链路中出现的异常。exceptiontranslationfilter过滤器会拦截处理 accessdeniedexception和 authenticationexception并添加到http响应中。
15、filtercurityinterceptor
org.springframework.curity.web.access.intercept.filtercurityinterceptor
获取所配置资源访问的授权信息,根据 curitycontextholder中存储的用户信息来决定其是否有权限。
到此这篇关于spring curity过滤器链加载执行流程源码分析的文章就介绍到这了,更多相关spring curity过滤器链内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 09:15:11,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/306ed044a059dfb7d62207760810619f.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Spring Security过滤器链加载执行流程源码解析.doc
本文 PDF 下载地址:Spring Security过滤器链加载执行流程源码解析.pdf
留言与评论(共有 0 条评论) |