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之过滤器链【探案】+源码剖析相关推荐

  1. tomcat 责任链设计模式 底层源码剖析

    今天晚上花了些时间debug了下tomcat,注意观察了下tomcat内部过滤器的实现,其实tomcat内部过滤器采用了责任链的设计模式, (其实struts2拦截器那一块采用了相似的设计模式),以下 ...

  2. 【Spring源码】Spring Transactional事务:传播机制(Propagation) 介绍 和 源码剖析

    [Spring源码]Spring Transactional事务:传播机制(Propagation) 源码剖析 关键词 AMethod调用BMethod,转载BMethod的角度来考虑:站在被调用者的 ...

  3. 【深入设计模式】责任链模式—责任链模式及责任链模式在源码中的应用

    文章目录 1. 责任链模式 1.1 责任链模式简介 1.2 责任链模式结构 1.3 责任链模式示例 2. 责任链模式在源码中的应用 2.1 Servlet 中的责任链模式 2.2 Spring 中的责 ...

  4. Spring中AOP源码剖析

    Spring中AOP源码剖析 关键词 aop的增强发生在后置处理器中(没有循环依赖) 最终增强是通过 递归调用 ,层层增强 一.环境准备 1.1 bean和接口 public class AopBea ...

  5. 一箭双雕 刷完阿里P8架构师spring学习笔记+源码剖析,涨薪8K

    关于Spring的叙述: 我之前死磕spring的时候,刷各种资料看的我是一头雾水的,后面从阿里的P8架构师那里拿到这两份资料,从源码到案例详细的讲述了spring的各个细节,是我学Spring的启蒙 ...

  6. Spring源码剖析——Bean的配置与启动

    IOC介绍   相信大多数人在学习Spring时 IOC 和 Bean 算得上是最常听到的两个名词,IOC在学习Spring当中出现频率如此之高必然有其原因.如果我们做一个比喻的话,把Bean说成Sp ...

  7. spring boot2.x设置session有效时间_Spring 源码解析 Scopes 之 Request 、Session 、Application...

    (给ImportNew加星标,提高Java技能) 转自:开源中国,作者:麦克斯 链接:my.oschina.net/wang5v/blog/3017934 Request.Session.Applic ...

  8. Spring循环依赖源码剖析

    Spring循环依赖源码剖析 一.场景介绍 二.整理执行流程总结 三.源码分析 编写测试类 /*** 测试循环依赖*/@Testpublic void testCyclicDependence(){A ...

  9. php极速链,php PHP极速链 战群源码系列(全自动采集更新+引流神器无数据库版) WEB(ASP,PHP,...) 261万源代码下载- www.pudn.com...

    文件名称: php下载  收藏√  [ 5  4  3  2  1 ] 开发工具: PHP 文件大小: 15699 KB 上传时间: 2015-08-10 下载次数: 5 提 供 者: 田维莉 详细说 ...

最新文章

  1. python import io_详解Python IO编程
  2. Hi,欢迎加入量子位AI社群
  3. Git使用列表(四)
  4. 结构型模式——适配器模式
  5. mac brew install nginx遇到的坑
  6. Emlog文章特色图生成插件分享
  7. Redis作者谈Redis应用场景
  8. html表单自动编号,自动编号插件
  9. oracle 提取连续数字,oracle 得到连续不重复的数字序列
  10. 图像增强处理之:同态滤波与Retinex算法(二)McCann Retinex和McCann99 Retinex迭代算法
  11. 如何将驱动程序静态编译进内核
  12. Python--turtle.circle()参数说明
  13. 怎么评判网络舆情分析系统好不好的指标标准详解
  14. 五线谱上的Linux旋律
  15. 「镁客早报」詹克团、吴忌寒或将卸任比特大陆CEO;特斯拉任命两位新独立董事... 1
  16. 基于O-RAN的无线云网络
  17. Unity之UI和登陆界面与暂停界面
  18. 服务器bios上传文件,巧改BIOS设置 让文件服务器性能提升10%
  19. 网站流量度量术语 IP PV UV
  20. Ubuntu安装ibus万能五笔

热门文章

  1. Python细枝末节个人知识记录
  2. fedora23 安装tftpd
  3. 【开源】这可能是封装微信 API 最全的 .NET SDK 了
  4. python循环怎么结束_python如何结束循环
  5. (语言学知识,勿点)越南语第一章
  6. Dweb:使用WebRTC / WebTorrent构建弹性Web
  7. 搭积木——pythonOJ笔记
  8. 杂谈---2014的第一篇博客
  9. 如何用度量数据驱动代码评审的改善
  10. 网易云信联手配音秀,打造语音聊天室互动新体验