二、Spring Boot集成Spring Security之实现原理
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实现原理概要介绍
- 使用WebSecurityConfiguration向Spring容器中注册FilterChainProxy类型的对象springSecurityFilterChain
 - 使用SecurityFilterAutoConfiguration向Spring容器中注册DelegatingFilterProxyRegistrationBean(实现了ServletContextInitializer)类型对象securityFilterChainRegistration
 - 使用ServletContextInitializer方式向Servlet上下文中注册原生过滤器DelegatingFilterProxy,其名称也是springSecurityFilterChain
 - 发送请求时Servlet 过滤器DelegatingFilterProxy拦截请求,从Spring容器中获取名称为springSecurityFilterChain的被代理的filter对象
 - 调用该filter对象的doFilter方法 
- 从配置的securityFilterChain过滤器链中获取匹配的过滤器链
 - 将原生的Servlet过滤器链,请求对象,匹配的securityFilterChain创建为新的过滤器链对象VirtualFilterChain
 - 调用VirtualFilterChain对象的doFilter方法
 - 先执行securityFilterChain过滤器链,后执行原生的Servlet过滤器链
 
 
二、使用WebSecurityConfiguration向Spring容器中注册FilterChainProxy类型的对象springSecurityFilterChain
1、未配置securityFilterChain过滤器链时使用默认配置用于生成默认securityFilterChain

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

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

三、使用代理模式和模板模式向Servlet容器中注册委托过滤器代理对象DelegatingFilterProxy
1、初始化DelegatingFilterProxyRegistrationBean对象(上文已介绍)
- DelegatingFilterProxyRegistrationBean类图

 
三、使用ServletContextInitializer方式注册DelegatingFilterProxy(模板模式)
- ServletContextInitializer接口onStartup方法(未探究该接口的实现机制,后续探究)
 - RegistrationBean实现onStartup方法,并调用预留抽象方法register
 - DynamicRegistrationBean实现register方法,并调用预留抽象方法addRegistration
 - AbstractFilterRegistrationBean实现addRegistration方法,并调用预留抽象方法getFilter获取过滤器,并将过滤器注册到Servlet上下文中
 - DelegatingFilterProxyRegistrationBean实现getFilter方法,创建DelegatingFilterProxy对象,并设置targetBeanName为springSecurityFilterChain和传递Spring容器上下文对象;DelegatingFilterProxy对象注册到servlet上下文中,未注册到Spring容器中
 
四、请求处理流程
1、servlet方式请求处理流程
- servlet原生过滤器处理:执行doFilter及之前的代码
 - servlet处理:执行service方法
 - servlet原生过滤器处理:执行doFilter之后的代码

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

 
 
五、总结
- 向servlet容器中注册DelegatingFilterProxy
 - DelegatingFilterProxy代理的过滤器是类型FilterChainProxy名称是springSecurityFilterChain
 - springSecurityFilterChain中有securityFilterChain集合
 - DelegatingFilterProxy.doFilter方法会调用springSecurityFilterChain.doFilter方法
 - springSecurityFilterChain.doFilter方法会创建虚拟过滤器VirtualFilterChain,并调用VirtualFilterChain.doFilter方法
 - VirtualFilterChain.doFilter方法会先执行securityFilterChain,再执行后续的原生过滤器链
 
相关文章:
二、Spring Boot集成Spring Security之实现原理
Spring Boot集成Spring Security之实现原理 一、Spring Security实现原理概要介绍二、使用WebSecurityConfiguration向Spring容器中注册FilterChainProxy类型的对象springSecurityFilterChain1、未配置securityFilterChain过滤器链时使用默认配置用于生成默认securityFilterCha…...
基于深度学习的点云处理模型PointNet++学习记录
前面我们已经学习了Open3D,并掌握了其相关应用,但我们也发现对于一些点云分割任务,我们采用聚类等方法的效果似乎并不理想,这时,我们可以想到在深度学习领域是否有相关的算法呢,今天,我们便来学…...
Javascript Object.assgin()详解以及深浅拷贝
Object.assign() 方法是 JavaScript 中用于将所有可枚举属性的值从一个或多个源对象复制到目标对象的方法。它将返回目标对象。这是一种浅拷贝,也就是说,如果源对象中的属性是一个对象或数组,那么这个属性的引用将被复制,而不是对…...
Redis篇(应用案例 - UV统计)(持续更新迭代)
目录 一、HyperLogLog 二、测试百万数据的统计 一、HyperLogLog 首先我们搞懂两个概念: UV:全称Unique Visitor,也叫独立访客量,是指通过互联网访问、浏览这个网页的自然人。 1天内同一个用户多次访问该网站,只记录…...
解锁微信小程序新技能:ECharts动态折线图搭配WebSocket,数据刷新快人一步!
在微信小程序中,数据可视化展示越来越受到开发者的重视。本文将为您介绍如何在微信小程序中使用ECharts绘制折线图,并通过WebSocket实现实时更新图表数据。 一、准备工作 创建微信小程序项目 首先,我们需要创建一个微信小程序项目。如果您已…...
上交所服务器崩溃:金融交易背后的技术隐患暴露杭州BGP高防服务器43.228.71.X
一、上交所宕机事件始末 2024 年 9 月 27 日,上交所交易系统突发崩溃,这一事件犹如一颗巨石投入平静的湖面,引起了轩然大波。当天上午,众多投资者反馈券商交易出现延迟问题,随后上交所发布了《关于股票竞价交易出现异常…...
P4、P4D、HelixSwarm 各种技术问题咨询
多年大型项目P4仓库运维经验,为你解决各种部署以及标准工业化流程问题。 Perforce 官网SDPHelixCore GuideHelixSwarm GuideHelixSwarm Download...
Linux 应用层协议HTTP
文章目录 一、初始HTTP协议二、URL格式网络中怎么通过URL进行定位资源呢?编码和解码 三、HTTP的请求格式和响应格式HTTP的请求格式HTTP的响应格式HTTP的请求方法GET方法POST方法GET Vs PostHTTP的封装和分用文件流操作浏览器获得一个完整的网页流程 HTTP的状态码对3…...
Python和C++混淆矩阵地理学医学物理学视觉语言模型和算法模型评估工具
🎯要点 优化损失函数评估指标海岸线检测算法评估遥感视觉表征和文本增强乳腺癌预测模型算法液体中闪烁光和切伦科夫光分离多标签分类任务性能评估有向无环图、多路径标记和非强制叶节点预测二元分类评估特征归因可信性评估马修斯相关系数对比其他准确度 Python桑…...
HTTP 协议的基本格式和 fiddler 的用法
HTTP协议格式 HTTP是⼀个⽂本格式的协议.可以通过Chrome开发者⼯具或者Fiddler抓包,分析HTTP请求/响应的细节. 抓包工具的使用 以Fiddler为例. • 左侧窗⼝显⽰了所有的HTTP请求/响应,可以选中某个请求查看详情. • 右侧上⽅显⽰了HTTP请求的报⽂内容.(切换到Raw标签⻚可以看…...
【计算机网络】详解UDP协议格式特点缓冲区
一、UDP 协议端格式 16 位 UDP 长度, 表示整个数据报(UDP 首部UDP 数据)的最大长度;如果16位UDP检验和出错,报文会被直接丢弃。 1.1、检验和出错的几种常见情况 数据传输过程中的比特翻转:在数据传输过程中,由于物理介质或网络设…...
网络安全cybersecurity的几个新领域
一、电力安全 同学们,今天我们来讨论一下为什么网络安全(Cybersecurity)和电力系统(Power Systems)这两个看似不同的领域会有交集。其实,这两个领域之间的联系非常紧密。以下我将从多个角度进行解释&#…...
android 原生加载pdf
implementation("androidx.pdf:pdf-viewer-fragment:1.0.0-alpha02") pdf加载链接...
MAE(平均绝对误差)和std(标准差)计算中需要注意的问题
一、MAE(平均绝对误差) 计算公式: yi 是第i个实际值y^i 是第i个预测值 计算方法: MAE就是求实际值与预测值之间的误差,需要给出预测值和原始的实际值 二、std(标准差) 计算公式&#x…...
03实战篇:把握667分析题的阅读材料、题目
本节你将学习到: 如何快速识别阅读材料的有效信息如何把握题目的作答方向 在正式进入具体的实战之前,我想先来讲一讲如何利用给定阅读材料、如何分析题目来确保不偏题等基础性知识。 高效利用给定阅读材料的方法 根据博主的实战经验来看,阅…...
C++系列-多态
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 多态 多态就是不同类型的对象,去做同一个行为,但是产生的结果是不同的。 比如说: 都是动物叫声,猫是喵喵,狗是汪汪&am…...
基于C++和Python的进程线程CPU使用率监控工具
文章目录 0. 概述1. 数据可视化示例2. 设计思路2.1 系统架构2.2 设计优势 3. 流程图3.1 C录制程序3.2 Python解析脚本 4. 数据结构说明4.1 CpuUsageData 结构体 5. C录制代码解析5.1 主要模块5.2 关键函数5.2.1 CpuUsageMonitor::Run()5.2.2 CpuUsageMonitor::ComputeCpuUsage(…...
fish-speech语音大模型本地部署
文章目录 fish-speech模型下载编译部署 小结 fish-speech模型 先说下fish-speech模型吧,可以先看下官网。如下: 这就是一个模型,可以根据一个样例声音,构建出自己需要的声音。其实,这个还是有很多用途的;…...
如何写出更牛的验证激励
前言 芯片验证是为了发现芯片中的错误而执行的过程,它是一个破坏性的过程。完备的验证激励可以更有效地发现芯片错误,进而缩短验证周期。合格的验证激励必须能产生所有可能的验证场景(完备性),包括合法和非法的场景,并保持最大的…...
EasyCVR视频汇聚平台:解锁视频监控核心功能,打造高效安全监管体系
随着科技的飞速发展,视频监控技术已成为现代社会安全、企业管理、智慧城市构建等领域不可或缺的一部分。EasyCVR视频汇聚平台作为一款高性能的视频综合管理平台,凭借其强大的视频处理、汇聚与融合能力,在构建智慧安防/视频监控系统中展现出了…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
