Spring Security之过滤器链【探案】+源码剖析
Spring Security之过滤器链【探案】
Spring Security常用过滤器介绍
过滤器是一种典型的AOP思想,关于什么是过滤器,就不赘述了,接下来咱们就一起看看Spring Security中这些过滤器都是干啥用的,有名字,大家可以自己在IDEA中Double Shift找到它们。
1.org.springframework.security.web.context.SecurityContextPersistenceFilter
SecurityContextPersistenceFilter主要是使用SecurityContextRepository在session中保存或更新一个 SecurityContext,并将SecurityContext给以后的过滤器使用,来为后续filter建立所需的上下文。SecurityContext中存储了当前用户的认证以及权限信息。
2.org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter
此过滤器用于集成SecurityContext到Spring异步执行机制中的WebAsyncManager。
3. org.springframework.security.web.header.HeaderWriterFilter
向请求的Header中添加相应的信息,可在http标签内部使用security:headers来控制。
4. org.springframework.security.web.csrf.CsrfFilter
csrf又称跨域请求伪造,SpringSecurity会对所有post请求验证是否包含系统生成的csrf的token信息,如果不包含,则报错起到防止csrf攻击的效果。
5.org.springframework.security.web.authentication.logout.LogoutFilter
匹配URL为/logout的请求,实现用户退出,清除认证信息。
6.org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
认证操作全靠这个过滤器,默认匹配URL为/login且必须为POST请求。
7.org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter
如果没有在配置文件中指定认证页面,则由该过滤器生成一个默认认证页面。
8.org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter
由此过滤器可以生产一个默认的退出登录页面
9.org.springframework.security.web.authentication.www.BasicAuthenticationFilter
此过滤器会自动解析HTTP请求中头部名字为Authentication,且以Basic开头的头信息。
10.org.springframework.security.web.savedrequest.RequestCacheAwareFilter
通过HttpSessionRequestCache内部维护了一个RequestCache,用于缓存HttpServletRequest
11.org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter
针对ServletRequest进行了一次包装,使得request具有更加丰富的API
12.org.springframework.security.web.authentication.AnonymousAuthenticationFilter
当SecurityContextHolder中认证信息为空,则会创建一个匿名用户存入到SecurityContextHolder中。spring security为了兼容未登录的访问,也走了一套认证流程,只不过是一个匿名的身份。
13.org.springframework.security.web.session.SessionManagementFilter
SecurityContextRepository限制同一用户开启多个会话的数量
14.org.springframework.security.web.access.ExceptionTranslationFilter
异常转换过滤器位于整个springSecurityFilterChain的后方,用来转换整个链路中出现的异常
15.org.springframework.security.web.access.intercept.FilterSecurityInterceptor
获取所配置资源访问的授权信息,根据SecurityContextHolder中存储的用户信息来决定其是否有权限。
好了,接下来有两个疑问!!
是不是Spring Security一共就这么多过滤器呢?
随着spring-security.xml配置的添加,还会出现新的过滤器。
是不是Spring Security每次都会加载这些过滤器呢?
根据你业务需求,随着spring-security.xml配置的修改,有些过滤器可能也用不上。
Spring Security过滤器链加载原理
我们并没有在web.xml中配置这些过滤器啊?它们都是怎么被加载出来的?
DelegatingFilterProxy
我们在web.xml中配置了一个名称为springSecurityFilterChain的过滤器DelegatingFilterProxy,接下我直接对 DelegatingFilterProxy源码里重要代码进行说明,其中删减掉了一些不重要的代码。
dofilter是过滤器的入口,找到dofilter
第二步:看最终加载的过滤器是谁
第三步:执行FilterChainProxy过滤器
附debug结果:
按下F8,
由此可知,DelegatingFilterProxy通过springSecurityFilterChain这个名称,得到了一个FilterChainProxy过滤器, 最终在第三步执行了这个过滤器。
FilterChainProxy
话不多说,直接上源码
我们同样是找到dofilter,
好了,准备debug,
惊不惊喜?十三个过滤器都在这里了!诶,不是十五个嘛?咋就才十三个了。这里给大家说明一下,我用的Spring Security版本是4.1.0.RELEASE。这也说明了随着版本更新会出现更多的过滤器。5.1.5.RELEASE有十五个过滤器。原来这些过滤器还真是都被封装进SecurityFilterChain中了。
SecurityFilterChain
最后看SecurityFilterChain,这是个接口,实现类也只有一个,这才是web.xml中配置的过滤器链对象。
这是一个接口,Ctrl+H看实现类
理论千万条,功能第一条,探寻底层,是为了更好的使用框架。(更多的Java学习知识可关注vx公众号: 进阶的coder)
Spring Security之过滤器链【探案】+源码剖析相关推荐
- tomcat 责任链设计模式 底层源码剖析
今天晚上花了些时间debug了下tomcat,注意观察了下tomcat内部过滤器的实现,其实tomcat内部过滤器采用了责任链的设计模式, (其实struts2拦截器那一块采用了相似的设计模式),以下 ...
- 【Spring源码】Spring Transactional事务:传播机制(Propagation) 介绍 和 源码剖析
[Spring源码]Spring Transactional事务:传播机制(Propagation) 源码剖析 关键词 AMethod调用BMethod,转载BMethod的角度来考虑:站在被调用者的 ...
- 【深入设计模式】责任链模式—责任链模式及责任链模式在源码中的应用
文章目录 1. 责任链模式 1.1 责任链模式简介 1.2 责任链模式结构 1.3 责任链模式示例 2. 责任链模式在源码中的应用 2.1 Servlet 中的责任链模式 2.2 Spring 中的责 ...
- Spring中AOP源码剖析
Spring中AOP源码剖析 关键词 aop的增强发生在后置处理器中(没有循环依赖) 最终增强是通过 递归调用 ,层层增强 一.环境准备 1.1 bean和接口 public class AopBea ...
- 一箭双雕 刷完阿里P8架构师spring学习笔记+源码剖析,涨薪8K
关于Spring的叙述: 我之前死磕spring的时候,刷各种资料看的我是一头雾水的,后面从阿里的P8架构师那里拿到这两份资料,从源码到案例详细的讲述了spring的各个细节,是我学Spring的启蒙 ...
- Spring源码剖析——Bean的配置与启动
IOC介绍 相信大多数人在学习Spring时 IOC 和 Bean 算得上是最常听到的两个名词,IOC在学习Spring当中出现频率如此之高必然有其原因.如果我们做一个比喻的话,把Bean说成Sp ...
- spring boot2.x设置session有效时间_Spring 源码解析 Scopes 之 Request 、Session 、Application...
(给ImportNew加星标,提高Java技能) 转自:开源中国,作者:麦克斯 链接:my.oschina.net/wang5v/blog/3017934 Request.Session.Applic ...
- Spring循环依赖源码剖析
Spring循环依赖源码剖析 一.场景介绍 二.整理执行流程总结 三.源码分析 编写测试类 /*** 测试循环依赖*/@Testpublic void testCyclicDependence(){A ...
- php极速链,php PHP极速链 战群源码系列(全自动采集更新+引流神器无数据库版) WEB(ASP,PHP,...) 261万源代码下载- www.pudn.com...
文件名称: php下载 收藏√ [ 5 4 3 2 1 ] 开发工具: PHP 文件大小: 15699 KB 上传时间: 2015-08-10 下载次数: 5 提 供 者: 田维莉 详细说 ...
最新文章
- python import io_详解Python IO编程
- Hi,欢迎加入量子位AI社群
- Git使用列表(四)
- 结构型模式——适配器模式
- mac brew install nginx遇到的坑
- Emlog文章特色图生成插件分享
- Redis作者谈Redis应用场景
- html表单自动编号,自动编号插件
- oracle 提取连续数字,oracle 得到连续不重复的数字序列
- 图像增强处理之:同态滤波与Retinex算法(二)McCann Retinex和McCann99 Retinex迭代算法
- 如何将驱动程序静态编译进内核
- Python--turtle.circle()参数说明
- 怎么评判网络舆情分析系统好不好的指标标准详解
- 五线谱上的Linux旋律
- 「镁客早报」詹克团、吴忌寒或将卸任比特大陆CEO;特斯拉任命两位新独立董事... 1
- 基于O-RAN的无线云网络
- Unity之UI和登陆界面与暂停界面
- 服务器bios上传文件,巧改BIOS设置 让文件服务器性能提升10%
- 网站流量度量术语 IP PV UV
- Ubuntu安装ibus万能五笔