Spring Boot 3.x 下 Spring Security 的执行流程、核心类和原理详解,结合用户描述的关键点展开说明,并以表格总结

以下是 Spring Boot 3.x 下 Spring Security 的执行流程、核心类和原理详解,结合用户描述的关键点展开说明,并以表格总结:


1. Spring Security 核心原理

Spring Security 通过 Filter 链 实现安全控制,其核心流程如下:

  1. 启动阶段
    • 引入 spring-boot-starter-security 后,Spring Boot 自动配置 SecurityAutoConfiguration
    • 通过 @EnableWebSecurity 注解触发安全框架的初始化,创建 SecurityFilterChain Bean(名称为 springSecurityFilterChain)。
  2. Filter 注册
    • DelegatingFilterProxy 拦截所有请求,从 Spring 容器中获取 springSecurityFilterChain(类型 FilterChainProxy)。
    • FilterChainProxy 管理多个 Filter 对象(如 UsernamePasswordAuthenticationFilterCsrfFilter 等),按顺序执行拦截逻辑。
  3. 请求处理
    • 每个请求经过 FilterChainProxydoFilter() 方法,依次调用拦截器链中的 Filter,完成认证、授权、CSRF 防护等功能。

2. 关键类与流程详解

(1) Spring Security 启动流程
  1. 依赖引入

    <!-- Maven 依赖 -->
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
    • 引入后,Spring Boot 自动启用 SecurityAutoConfiguration
  2. Bean 创建

    • @EnableWebSecurity 注解触发 WebSecurityConfiguration,创建 SecurityFilterChain Bean(名称 springSecurityFilterChain)。
    • SecurityFilterChain 实际类型为 FilterChainProxy,包含多个 Filter 对象。
  3. 自动配置日志

    Using generated security password: <random-generated-password>
    
    • 默认启用安全配置时,Spring Boot 会生成随机密码(可通过 management.security.enabled=false 禁用)。

(2) 核心类与协作关系
类名作用关键方法/属性
FilterChainProxy核心过滤器链,管理所有安全 Filter 的执行顺序。getFilters():获取 Filter 列表
DelegatingFilterProxyServlet 容器的适配器,将请求委托给 Spring 容器中的 FilterChainProxyinitFilterBean():初始化并获取 Bean
SecurityFilterChain安全过滤器链的抽象接口,由 FilterChainProxy 实现。getFilters():定义 Filter 顺序
WebSecurityConfigurerAdapter过时配置类(Spring Boot 2.x),现改用 SecurityFilterChain Bean。已弃用,需改用 @Bean SecurityFilterChain
UsernamePasswordAuthenticationFilter处理表单登录认证的 Filter。attemptAuthentication():验证用户凭证
CsrfFilter处理 CSRF 令牌生成与验证。getToken():获取 CSRF Token

(3) FilterChainProxy 的执行流程
  1. 初始化
    • 通过 DelegatingFilterProxy 从 Spring 容器获取 springSecurityFilterChain Bean。
  2. 请求拦截
    • 每个请求到达 DelegatingFilterProxy 后,调用 FilterChainProxydoFilter() 方法。
    • FilterChainProxy 遍历 filters 列表,按顺序执行每个 Filter 的 doFilter()
  3. Filter 顺序
    • 默认顺序由 SecurityFilterChain 定义(如:ChannelProcessingFilterWebAsyncManagerIntegrationFilter → …)。
    • 可通过 SecurityFilterChain 自定义 Filter 顺序。

(4) 配置注解对比
注解适用场景功能
@EnableWebSecurityWeb 应用启用安全配置,创建 SecurityFilterChain,集成 Web 特性(如表单登录)。
@EnableGlobalAuthentication非 Web 应用(如消息服务)仅启用认证功能,不包含 Web 相关 Filter(如 CSRF、表单登录)。
@EnableMethodSecurity方法级安全控制启用 @PreAuthorize@PostFilter 等注解。

3. 自定义 Filter 的实现

(1) 创建自定义 Filter
@Component
public class CustomFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 自定义逻辑(如 Token 解析)chain.doFilter(request, response);}
}
(2) 注册到 FilterChainProxy
@Configuration
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class);return http.build();}
}

4. Spring Boot 3.x 特殊说明

  • 自动配置变化
    • Spring Boot 3.x 中 WebSecurityConfigurerAdapter 已弃用,需通过 @Bean SecurityFilterChain 直接配置。
  • 日志控制
    • 随机密码日志可通过 logging.level.org.springframework.security=ERROR 禁用。

5. 总结表格

模块/组件作用关键类/注解
启动与配置初始化安全框架,创建 Filter 链@EnableWebSecuritySecurityAutoConfigurationSecurityFilterChain
Servlet 适配将 Servlet 请求委托给 Spring 容器中的 Filter 链DelegatingFilterProxy
Filter 链管理管理 Filter 顺序和执行逻辑FilterChainProxySecurityFilterChain
认证与授权用户身份验证、权限控制UsernamePasswordAuthenticationFilterRoleVoterAccessDecisionManager
扩展与自定义注册自定义 Filter 或修改安全策略addFilterBefore()addFilterAfter()@Bean SecurityFilterChain

6. 执行流程图(文字描述)

  1. 请求到达 Web 容器DelegatingFilterProxy获取 springSecurityFilterChainFilterChainProxy遍历并执行所有 Filter最终响应
    • 每个 Filter(如 CsrfFilterSecurityContextPersistenceFilter)按顺序执行。

通过以上流程和组件的协作,Spring Security 实现了从请求拦截到权限控制的完整安全机制。在 Spring Boot 3.x 中,需特别注意配置方式的更新(如弃用 WebSecurityConfigurerAdapter),以确保与新版本兼容。

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

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

相关文章

Vue:路由切换表格塌陷

目录 一、 出现场景二、 解决方案 一、 出现场景 当路由切换时&#xff0c;表格操作栏会出现行错乱、塌陷的问题 二、 解决方案 在组件重新被激活的时候刷新表格 <el-table ref"table"></el-table>activated(){this.$nextTick(() > {this.$refs[t…

文件上传漏洞原理学习

什么是文件上传漏洞 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。“文件上传” 本身没有问题&#xff0c;有问题的是文件上传后&#xff0c;服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全&#…

leetcode_数组 189. 轮转数组

189. 轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3输出: [5,6,7,1,2,3,4] 示例 2: 输入&#xff1a;nums [-1,-100,3,99], k 2输出&#xff1a;[3,99,-1,-100] 思…

天元证券|空仓一个月 这批新基金冲进去了!

多只一个月都按兵不动的次新基金&#xff0c;终于在4月7日冲进去了。 券商中国记者注意到&#xff0c;多只在3月初成立的新基金产品&#xff0c;在保持一个月净值零波动之后&#xff0c;终于在4月7日建仓了。多只新基金产品当日净值出现约1%至2%的波动幅度&#xff0c;参考4月7…

centos7系统搭建nagios监控

~监控节点安装 1. 系统准备 1.1 更新系统并安装依赖 sudo yum install -y httpd php php-cli gcc glibc glibc-common gd gd-devel make net-snmp openssl-devel wget unzip sudo yum install -y epel-release # 安装 EPEL 仓库 sudo yum install -y automake autoconf lib…

3. git config

文章目录 基本概述配置级别基本用法设置配置项查看配置项删除配置项 常用配置项 基本概述 git config 的作用是&#xff1a;设置用户信息、编辑器、别名、仓库行为等。 配置级别 级别作用范围配置文件路径命令选项仓库级别&#xff08;Local&#xff09;当前仓库.git/config…

WHAT - React 组件的 props.children 属性

目录 一、什么是 children二、基本用法三、类型定义&#xff08;TypeScript&#xff09;四、一些高级用法1. 条件渲染 children2. 多个 children 插槽&#xff08;命名插槽&#xff09; 五、children 的优势总结 在 React 中&#xff0c;children 是一个非常重要且特殊的 内置属…

Spring Boot开发三板斧:高效构建企业级应用的核心技法

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;获得2024年博客之星荣誉证书&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发技术&#xff0c…

实战篇-梳理时钟树

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 这是B站傅里叶的猫视频的笔记 一、建立工程 以Vivado的wave_gen为例子。为了引入异…

图灵逆向——题六-倚天剑

从第六题开始就要有个先看看请求头的习惯了[doge]。 别问博主为什么要你养成这个习惯&#xff0c;问就是博主被坑过。。。 headers里面有一个加密参数S&#xff0c;然后你就去逆向这个S对吧。 然后一看响应&#xff1a; 好家伙返回的还是个密文&#xff0c;所以要两次逆向咯。…

ubuntu自动更新--unattended-upgrades

ubuntu自动更新--unattended-upgrades 1 介绍2 发展历程3 配置与使用4 disable Auto update服务命令 参考 1 介绍 Unattended-Upgrades 是一个用于自动更新 Debian 及其衍生系统&#xff08;如 Ubuntu&#xff09;的工具。它的主要功能是自动检查、下载并安装系统更新&#xf…

从 Excel 到你的表格应用:条件格式功能的嵌入实践指南

一、引言 在日常工作中&#xff0c;面对海量数据时&#xff0c;如何快速识别关键信息、发现数据趋势或异常值&#xff0c;是每个数据分析师面临的挑战。Excel的条件格式功能通过自动化的视觉标记&#xff0c;帮助用户轻松应对这一难题。 本文将详细介绍条件格式的应用场景&am…

【HarmonyOS Next之旅】DevEco Studio使用指南(十一)

目录 1 -> 代码实时检查 2 -> 代码快速修复 3 -> C快速修复使用演示 3.1 -> 填充switch语句 3.2 -> 使用auto替换类型 3.3 -> 用&#xff1f;&#xff1a;三元操作符替换if-else 3.4 -> 从使用处生成构造函数 3.5 -> 将变量拆分为声明和赋值 1…

win10离线环境下配置wsl2和vscode远程开发环境

win10离线环境下配置wsl2和vscode远程开发环境 环境文件准备wsl文件准备vscode文件准备 内网环境部署wsl环境部署vscode环境部署 迁移后Ubuntu中的程序无法启动 环境 内网机&#xff1a;win10、wsl1 文件准备 wsl文件准备 在外网机上的wsl安装Ubuntu24.04&#xff0c;直接在…

Elasticsearch | ES索引模板、索引和索引别名的创建与管理

关注&#xff1a;CodingTechWork 引言 在使用 Elasticsearch (ES) 和 Kibana 构建数据存储和分析系统时&#xff0c;索引模板、索引和索引别名的管理是关键步骤。本文将详细介绍如何通过 RESTful API 和 Kibana Dev Tools 创建索引模板、索引以及索引别名&#xff0c;并提供具…

提高MCU的效率方法

要提高MCU(微控制器单元)的编程效率,需要从硬件特性、代码优化、算法选择、资源管理等多方面入手。以下是一些关键策略: 1. 硬件相关优化 时钟与频率: 根据需求选择合适的时钟源(内部/外部振荡器),避免过高的时钟频率导致功耗浪费。关闭未使用的外设时钟(如定时器、UA…

Visual Studio未能加载相应的Package包弹窗报错

环境介绍&#xff1a; visulal studio 2019 问题描述&#xff1a; 起因&#xff1a;安装vs扩展插件后&#xff0c;重新打开Visual Studio&#xff0c;报了一些列如下的弹窗错误&#xff0c;即使选择不继续显示该错误&#xff0c;再次打开后任然报错&#xff1b; 解决思路&am…

Android中Jetpack设计理念、核心组件 和 实际价值

一、Jetpack 的定义与定位&#xff08;基础必答&#xff09; Jetpack 是 Google 推出的 Android 开发组件集合&#xff0c;旨在&#xff1a; 加速开发&#xff1a;提供标准化、开箱即用的组件 消除样板代码&#xff1a;解决传统开发中的重复劳动问题 兼容性保障&#xff1a;…

计算机网络 实验二 VLAN 的配置与应用

一、实验目的 1. 熟悉 VLAN 和 PORT VLAN 的原理&#xff1b; 2. 熟悉华为网络模拟器的使用&#xff1b; 3. 掌握网络拓扑图的绘制&#xff1b; 4. 掌握单交换机内 VLAN 的配置。 二、实验设备 PC、华为模拟器 ENSP。 三、实验步骤 知识准备&#xff1a;VLAN 和 PORT V…

聊透多线程编程-线程基础-3.C# Thread 如何从非UI线程直接更新UI元素

目录 1. 使用 Control.Invoke 或 Control.BeginInvoke&#xff08;Windows Forms&#xff09; 2. 使用 Dispatcher.Invoke 或 Dispatcher.BeginInvoke&#xff08;WPF&#xff09; 3. 使用 SynchronizationContext 桌面应用程序&#xff08;如 Windows Forms 或 WPF&#xf…