二、Spring Boot集成Spring Security之实现原理

news2024/12/24 11:30:17

Spring Boot集成Spring Security之实现原理

  • 一、Spring Security实现原理概要介绍
  • 二、使用WebSecurityConfiguration向Spring容器中注册FilterChainProxy类型的对象springSecurityFilterChain
    • 1、未配置securityFilterChain过滤器链时使用默认配置用于生成默认securityFilterChain
    • 2、注册securityFilterChain过滤器链构造器
    • 3、构建FilterChainProxy类型的对象springSecurityFilterChain并注册到Spring容器中
  • 三、使用代理模式和模板模式向Servlet容器中注册委托过滤器代理对象DelegatingFilterProxy
    • 1、初始化DelegatingFilterProxyRegistrationBean对象([上文](https://blog.csdn.net/dhbfjh/article/details/142634408)已介绍)
  • 三、使用ServletContextInitializer方式注册DelegatingFilterProxy(模板模式)
  • 四、请求处理流程
    • 1、servlet方式请求处理流程
    • 2、Spring Security方式请求处理流程
  • 五、总结

一、Spring Security实现原理概要介绍

  1. 使用WebSecurityConfiguration向Spring容器中注册FilterChainProxy类型的对象springSecurityFilterChain
  2. 使用SecurityFilterAutoConfiguration向Spring容器中注册DelegatingFilterProxyRegistrationBean(实现了ServletContextInitializer)类型对象securityFilterChainRegistration
  3. 使用ServletContextInitializer方式向Servlet上下文中注册原生过滤器DelegatingFilterProxy,其名称也是springSecurityFilterChain
  4. 发送请求时Servlet 过滤器DelegatingFilterProxy拦截请求,从Spring容器中获取名称为springSecurityFilterChain的被代理的filter对象
  5. 调用该filter对象的doFilter方法
    1. 从配置的securityFilterChain过滤器链中获取匹配的过滤器链
    2. 将原生的Servlet过滤器链,请求对象,匹配的securityFilterChain创建为新的过滤器链对象VirtualFilterChain
    3. 调用VirtualFilterChain对象的doFilter方法
    4. 先执行securityFilterChain过滤器链,后执行原生的Servlet过滤器链

二、使用WebSecurityConfiguration向Spring容器中注册FilterChainProxy类型的对象springSecurityFilterChain

1、未配置securityFilterChain过滤器链时使用默认配置用于生成默认securityFilterChain

默认securityFilterChain

2、注册securityFilterChain过滤器链构造器

注册securityFilterChain过滤器链构造器

3、构建FilterChainProxy类型的对象springSecurityFilterChain并注册到Spring容器中

创建springSecurityFilterChain

三、使用代理模式和模板模式向Servlet容器中注册委托过滤器代理对象DelegatingFilterProxy

1、初始化DelegatingFilterProxyRegistrationBean对象(上文已介绍)

  • DelegatingFilterProxyRegistrationBean类图
    类图

三、使用ServletContextInitializer方式注册DelegatingFilterProxy(模板模式)

  1. ServletContextInitializer接口onStartup方法(未探究该接口的实现机制,后续探究)
  2. RegistrationBean实现onStartup方法,并调用预留抽象方法register
  3. DynamicRegistrationBean实现register方法,并调用预留抽象方法addRegistration
  4. AbstractFilterRegistrationBean实现addRegistration方法,并调用预留抽象方法getFilter获取过滤器,并将过滤器注册到Servlet上下文中
  5. DelegatingFilterProxyRegistrationBean实现getFilter方法,创建DelegatingFilterProxy对象,并设置targetBeanName为springSecurityFilterChain和传递Spring容器上下文对象;DelegatingFilterProxy对象注册到servlet上下文中,未注册到Spring容器中

四、请求处理流程

1、servlet方式请求处理流程

  1. servlet原生过滤器处理:执行doFilter及之前的代码
  2. servlet处理:执行service方法
  3. servlet原生过滤器处理:执行doFilter之后的代码
    servlet方式请求处理流程

2、Spring Security方式请求处理流程

  1. servlet原生过滤器处理:执行chain.doFilter及之前的代码
    1. 执行到DelegatingFilterProxy的doFilter方法
    2. 从Spring容器中获取名称springSecurityFilterChain的FilterChainProxy对象(第一次请求时执行,后续不在执行)
    3. 调用FilterChainProxy的doFilter方法
    4. 从配置的securityFilterChain过滤器链中获取匹配的过滤器链
    5. 将原生的Servlet过滤器链,请求对象,匹配的securityFilterChain创建为新的过滤器链对象VirtualFilterChain
    6. 调用VirtualFilterChain对象的doFilter方法
    7. 先执行securityFilterChain过滤器链,后执行原生的Servlet过滤器链
  2. servlet处理:执行service方法
  3. servlet原生过滤器处理:执行chain.doFilter之后的代码
    1. 执行到DelegatingFilterProxy的doFilter之后的方法
    2. 调用FilterChainProxy的doFilter之后的方法
    3. 调用VirtualFilterChain对象的doFilter之后的方法
    4. 执行原生的Servlet过滤器链之后的方法
      Spring Security方式请求处理流程

五、总结

  1. 向servlet容器中注册DelegatingFilterProxy
  2. DelegatingFilterProxy代理的过滤器是类型FilterChainProxy名称是springSecurityFilterChain
  3. springSecurityFilterChain中有securityFilterChain集合
  4. DelegatingFilterProxy.doFilter方法会调用springSecurityFilterChain.doFilter方法
  5. springSecurityFilterChain.doFilter方法会创建虚拟过滤器VirtualFilterChain,并调用VirtualFilterChain.doFilter方法
  6. VirtualFilterChain.doFilter方法会先执行securityFilterChain,再执行后续的原生过滤器链

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java SE 总结

Java SE(Standard Edition)是Java编程语言的标准版本,提供了基础的编程环境和API,适用于开发和运行Java应用程序。下面是Java SE的几个重要方面的知识回顾与总结。 1. Java环境基础 具体可参考这里对三者的介绍 传送门 1.1 JVM…

后端-对表格数据进行添加、删除和修改

一、添加 要求: 按下添加按钮出现一个板块输入添加的数据信息,点击板块的添加按钮,添加;点击取消,板块消失。 实现: 1.首先,设计页面输入框格式,表格首行 2.从数据库里调数据 3.添加…

SpringBoot助力墙绘艺术市场创新

3 系统分析 当用户确定开发一款程序时,是需要遵循下面的顺序进行工作,概括为:系统分析–>系统设计–>系统开发–>系统测试,无论这个过程是否有变更或者迭代,都是按照这样的顺序开展工作的。系统分析就是分析系…

数字化智能工厂应用场景

数字化智能工厂的应用场景广泛,涵盖了多个行业和领域。以下是一些主要的应用场景: 一、制造业 汽车制造:数字化智能工厂在汽车制造业中得到了广泛应用。通过自动化生产线、机器人、物联网和人工智能等技术,汽车制造商能够实现高…

三分钟速览:Node.js 版本差异与关键特性解析

Node.js 是一个广泛使用的 JavaScript 运行时环境,允许开发者在服务器端运行 JavaScript 代码。随着技术的发展,Node.js 不断推出新版本,引入新特性和改进。了解不同版本之间的差异对于开发者来说至关重要。以下是一个快速指南,帮…

Redis篇(应用案例 - 附近商户)(持续更新迭代)

目录 一、GEO数据结构的基本用法 二、导入店铺数据到GEO 三、实现附近商户功能 一、GEO数据结构的基本用法 GEO就是Geolocation的简写形式,代表地理坐标。 Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来…

【高性能内存池】基本框架 + 固定长度内存池实现 1

高性能内存池 1. 基本框架2. 定长内存池的实现2.1 介绍定长内存池2.2 T* New()2.3 void Delete(T* obj) 3. 源码(附赠测试)4. 总结 1. 基本框架 高并发内存池主要由三个部分构成: 1.thread cache:用于小于256KB的内存的分配。线程缓存是每个…

opencv实战项目(三十):使用傅里叶变换进行图像边缘检测

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一,什么是傅立叶变换?二,图像处理中的傅立叶变换:三,傅里叶变换进行边缘检测: 一&#xff0c…

适合初学者的[JAVA]: 基础面试题

目录 说明 前言 String/StringBuffer/StringBuilder区别 第一点: 第二点: 总结: 反射机制 JVM内存结构 运行时数据区域被划分为5个主要组件: 方法区(Method Area) 堆区(Heap Area) 栈区&#x…

局部整体(七)利用python绘制圆形嵌套图

局部整体(七)利用python绘制圆形嵌套图 圆形嵌套图( Circular Packing)简介 将一组组圆形互相嵌套起来,以显示数据的层次关系,类似于矩形树图。数据集中每个实体都由一个圆表示,圆圈大小与其代…

Spring Task 调度任务

Spring Task是调度任务框架,通过配置,程序可以按照约定的时间自动执行代码逻辑,基于注解方式实现需要如下注解: Component 任务调度类交给Spring IOC容器管理EnableScheduling 启用 Spring 的定时任务(Scheduling&…

专业学习|随机规划概观(内涵、分类以及例题分析)

一、随机规划概览 (一)随机规划的定义 随机规划是通过考虑随机变量的不确定性来制定优化决策的一种方法。其基本思想是在决策过程中,目标函数和约束条件可以包含随机因素。 (1)重点 随机规划的中心问题是选择参数&am…

最新版ingress-nginx-controller安装 使用host主机模式

最新版ingress-nginx-controller安装 使用host主机模式 文章目录 最新版ingress-nginx-controller安装 使用host主机模式单节点安装方式多节点高可用安装方式 官方参考链接: https://github.com/kubernetes/ingress-nginx/ https://kubernetes.github.io/ingress-ng…

05_中断与数码管动态显示

中断是单片机系统重点中的重点,因为有了中断,单片机就具备了快速协调多模块工作的能力,可以完成复杂的任务。本章将首先带领大家学习一些必要的 C 语言基础知识,然后讲解数码管动态显示的原理,并最终借助于中断系统来完…

VS code user setting 与 workspace setting 的区别

VS code user setting 与 workspace setting 的区别 引言正文引言 相信有不少开始接触 VS code 的小伙伴会有疑问,user setting 与 workspace setting 有什么区别呢?这里我们来说明一下 正文 首先,当我们使用 Ctrl + Shift + P 打开搜索输入 setting 后,可以弹出 4 个se…

SSM+Vue家教平台系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作…

网站建设中,https协议和http协议分别是什么,有什么区别?

HTTP(超文本传输协议)和 HTTPS(安全超文本传输协议)是互联网通信中两种非常关键的协议,它们在安全性、性能以及证书等方面存在区别。以下是具体分析: 安全性 HTTP:数据传输以明文形式进行&#…

宝塔搭建nextcould 30docker搭建onlyoffic8.0

宝塔搭建nextcould 宝塔搭建nextcould可以参考这两个博文 我搭建的是30版本的nextcould,服务组件用的是下面这些,步骤是一样的,只是版本不一样而已 nginx 1.24.0 建议选择nginx,apache没成功。 MySQL 8.0以上都可以 php 8.2.…

“你好BOE”重磅亮相首届上海国际光影节 打造“艺术x科技”顶级影像盛宴

黄浦江畔,北外滩胜地。作为首届上海国际光影节虹口区分会场的重点项目之一,9月29日-10月5日,BOE(京东方)年度标杆性品牌巡展IP“你好BOE”Super O SPACE影像科技展在上海北外滩滨江5米平台盛大启幕,BOE(京东方)携手上海电影、上影元、OUTPUT、新浪微博、海信、OPPO、京东等众多…

信创产品测试报告有什么作用?测试依据是什么?

一、信创产品测试报告是什么? 针对于某一款具体的软件产品或硬件产品进行的产品测试,验证其是否符合信创的要求。这一类产品,主要分为四类: 三类九款产品(计算机终端、操作系统、数据库);通用…