spring-security 过滤器链初始化以及执行过程分析-Servelt

spring-security 架构-Servlet

  • 版本信息
  • Java Web Servlet
    • servlet 处理 http 请求过程- Tomcat 容器
  • Spring Security 过滤器链如何注册?
  • DelegatingFilterProxy、FilterChainProxy、SecurityFilterChain
    • 执行流程图

SpringBoot web 项目默认使用的是 servlet 处理请求的,本章介绍 spring-security 过滤器链初始化以及执行过程。

版本信息

内容版本
JDK17
spring-boot-starter-web3.2.2
spring-boot-starter-security3.2.2
spring-security6.2.1

Java Web Servlet

servlet 处理 http 请求过程- Tomcat 容器

在这里插入图片描述

  1. 根据 url 匹配 使用那个 servlet 处理请求,源码方法 org.apache.catalina.mapper.Mapper#internalMapWrapper,具体内容参考博客https://blog.csdn.net/m0_52440465/article/details/122766656。SpringBoot 项目如果未配置Servlet,一般会匹配到 DispatcherServlet (Spring MVC)

  2. 创建过滤器链,方法org.apache.catalina.core.StandardWrapperValve#invoke
    创建过滤器方法
    根据请求url 匹配需要执行的过滤器
    添加过滤器到过滤器链

在这里插入图片描述
3. 执行过滤器方法,在执行Spring Security 过滤器的时候,第一次请求会在Spring 容器中查找对应的过滤器链,注册到 Tomcat 容器中的是 Spring Security 的代理过滤器 DelegatingFilterProxy
4. servlet 处理请求,servlet 处理请求的时候经过若干个拦截器

Spring Security 过滤器链如何注册?

  1. DelegatingFilterProxyRegistrationBean 设置目标 Bean 的名字为 springSecurityFilterChain,在执行过滤器链的时候,会根据这个名字在Spring容器中查找对用的Spring Security过滤器链
    在这里插入图片描述
    将 DelegatingFilterProxyRegistrationBean 加载到服务上下文
    org.springframework.boot.web.servlet.ServletContextInitializerBeans#addServletContextInitializerBean(java.lang.String, org.springframework.boot.web.servlet.ServletContextInitializer, org.springframework.beans.factory.ListableBeanFactory)
    在这里插入图片描述
    org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#selfInitialize
    在这里插入图片描述
    获取 DelegatingFilterProxy 实例,添加到应用上下文
    在这里插入图片描述
    org.springframework.boot.web.servlet.AbstractFilterRegistrationBean#addRegistration
    在这里插入图片描述
    创建 DelegatingFilterProxy 实例, 方法org.springframework.boot.web.servlet.DelegatingFilterProxyRegistrationBean#getFilter
    在这里插入图片描述
    注册到Tomcat 容器中
    org.apache.catalina.core.ApplicationFilterRegistration#addMappingForUrlPatterns
    在这里插入图片描述

  2. 生成默认的过滤器链,DefaultSecurityFilterChain,boot 自动装载构建
    org.springframework.boot.autoconfigure.security.servlet.SpringBootWebSecurityConfiguration.SecurityFilterChainConfiguration#defaultSecurityFilterChain默认过滤器链
    org.springframework.security.config.annotation.web.builders.HttpSecurity#performBuild 方法中生成的默认过滤器链 DefaultSecurityFilterChain
    在这里插入图片描述

  3. 创建过滤器链代理类FilterChainProxy,Bean 的名字为 springSecurityFilterChain, 注意,这里生成Bean的名字和第一步 DelegatingFilterProxy 目标Bean 的名字是一致的
    在这里插入图片描述
    从这个Bean 的创建代码,可以看出,一个Bean可以支持多个SecurityFilterChain过滤器链的配置

  4. 构建过滤器链代理类 FilterChainProxywebSecurity.build() 方法会调用父类的 org.springframework.security.config.annotation.web.builders.WebSecurity#performBuild 方法,过滤器链代理类生成的代码片段如下
    在这里插入图片描述

DelegatingFilterProxy、FilterChainProxy、SecurityFilterChain

图片来源于官网 https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-delegatingfilterproxy

DelegatingFilterProxy 委托代理过滤器类,服务启动初始化的时候会注册到Tomcat容器中。在http请求到达服务器,执行过滤器链方法的时候,根据目标Bean的名字 springSecurityFilterChain,在 Spring容器查找对应的Bean代理过滤器FilterChainProxy。代理过滤器会根据请求匹配到 SecurityFilterChain 过滤器链,然后执行对应的过滤器方法。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

执行流程图

在这里插入图片描述

  1. 创建过滤器链,调用的方法 org.apache.catalina.core.StandardWrapperValve#invoke, 执行创建过滤器链方法org.apache.catalina.core.ApplicationFilterFactory#createFilterChain
  2. DelegatingFilterProxy 执行doFilter逻辑,先判断是否初始化了目标过滤器,如果没有的,在Spring容器中,根据目标Bean的名字查找过滤器
    在这里插入图片描述
  3. FilterChainProxy 代理过滤器类,执行过滤器方法的时候,会根据请求匹配对应的Spring Security 过滤器链。org.springframework.security.web.FilterChainProxy#doFilterInternal
    在这里插入图片描述
    org.springframework.security.web.FilterChainProxy#getFilters(jakarta.servlet.http.HttpServletRequest) 匹配过滤器链,获取将要执行的过滤器列表
    在这里插入图片描述
  4. 执行过滤器方法,获取到过滤器列表之后,会构造一个虚拟过滤器链
    org.springframework.security.web.FilterChainProxy.VirtualFilterChainDecorator#decorate(jakarta.servlet.FilterChain, java.util.List<jakarta.servlet.Filter>)
    在这里插入图片描述
    执行过滤器逻辑 org.springframework.security.web.FilterChainProxy.VirtualFilterChain#doFilter
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/463269.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8算法改进【NO.101】引入最新的损失函数Focaler-IoU

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 第一…

Linux操作系统基础(六):Linux常见命令(一)

文章目录 Linux常见命令 一、命令结构 二、ls命令 三、cd命令 四、mkdir命令 五、touch命令 六、rm命令 七、cp命令 八、mv命令 九、cat命令 十、more命令 Linux常见命令 一、命令结构 command [-options] [parameter]说明: command : 命令名, 相应功能的英文单词…

如何解决利用cron定时任务自动更新SSL证书后Nginx重启问题

利用cron定时任务自动更新SSL证书后&#xff0c;用浏览器访问网站&#xff0c;获取到的证书仍然是之前的。原因在于没有对Nginx进行重启。 据说certbot更新完成证书后会自动重启Nginx,但显然经我检测不是这回事儿。 所以我们需要创建一bash脚本&#xff0c;然后定时调用这个脚…

了解数据治理体系化建模

目录 一、走近数据体系化建模 &#xff08;一&#xff09;软件体系化建模 &#xff08;二&#xff09;数据体系化建模 二、数据体系化建模实践 三、数据管理考量思考 &#xff08;一&#xff09;数据质量方面的考量 &#xff08;二&#xff09;数据安全、合规方面的考量…

【MATLAB源码-第138期】基于matlab的D2D蜂窝通信仿真,对比启发式算法,最优化算法和随机算法的性能。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 D2D蜂窝通信介绍 D2D蜂窝通信允许在同一蜂窝网络覆盖区域内的终端设备直接相互通信&#xff0c;而无需数据经过基站或网络核心部分转发。这种通信模式具有几个显著优点&#xff1a;首先&#xff0c;它可以显著降低通信延迟&…

【知识整理】招人理念、组织结构、招聘

1、个人思考 几个方面&#xff1a; 新人&#xff1a;选、育、用、留 老人&#xff1a;如何甄别&#xff1f; 团队怎么演进&#xff1f; 有没有什么注意事项 怎么做招聘&#xff1f; 2、 他人考虑 重点&#xff1a; 1、从零开始&#xff0c;讲一个搭建团队的流程 2、标…

RocketMQ(二):领域模型(生产者、消费者)

1 生产者&#xff08;Producer&#xff09; 本节介绍Apache RocketMQ 中生产者的定义、模型关系、内部属性、版本兼容和使用建议。 1.1 定义 生产者是Apache RocketMQ 系统中用来构建并传输消息到服务端的运行实体。 生产者通常被集成在业务系统中&#xff0c;将业务消息按照要…

AWD-Test2

1.已知账号密码&#xff0c;可SSH连接进行代码审计。2.登录可万能密码进入&#xff0c;也可注册后登录。3.修改url参数&#xff0c;发现报错。确定为Linux系统4.写入一句话&#xff0c;并提交。&#xff08;也可以文件上传&#xff0c;这里采用简洁的方法&#xff09; <?p…

numpy基础之swapaxes

1 numpy基础之swapaxes ndarray数组元素都可以用轴的索引进行唯一标识。 numpy中ndarray.transpose()的入参axes轴数量需要ndarray.ndim个(轴数量个&#xff0c;有多少个轴就要送多少个)&#xff0c;而swapaxes()只需要2个。即&#xff0c;transpose()可以一次交换全部轴&…

第二节 zookeeper基础应用与实战

目录 1. Zookeeper命令操作 1.1 Zookeeper 数据模型 1.2 Zookeeper服务端常用命令 1.3 Zookeeper客户端常用命令 1.3.1 基本CRUD 1.3.2 创建临时&顺序节点 2. Zookeeper JavaAPI操作 2.1 Curator介绍 2.2 引入Curator 2.3 建立连接 2.4 添加节点 2.5 修改节点 …

利用Python画布之乌龟的爬行

一.基础操作 1.引入turtle库 首先&#xff0c;在你的Python代码中引入turtle库&#xff0c;代码如下&#xff1a; import turtle 2.创建画布 要创建一个画布&#xff0c;你可以使用turtle库中的Screen类。Screen类提供了一个窗口&#xff0c;你可以在其中创建一个画布。下…

LLaMA 入门指南

LLaMA 入门指南 LLaMA 入门指南LLaMA的简介LLaMA模型的主要结构Transformer架构多层自注意力层前馈神经网络Layer Normalization和残差连接 LLaMA模型的变体Base版本Large版本Extra-Large版本 LLaMA模型的特点大规模数据训练 LLaMA模型常用数据集介绍公共数据来源已知的数据集案…