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.pswp.cn/pingmian/76121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76121.shtml
英文地址,請注明出處:http://en.pswp.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…