再見,WebSecurityConfigurerAdapter!你好,SecurityFilterChain

圖片

對于許多經驗豐富的 Spring開發者來說,WebSecurityConfigurerAdapter?是一個再熟悉不過的名字。在很長一段時間里,它幾乎是所有 Spring Security 配置的起點和核心。然而,隨著 Spring Boot 3.x 和 Spring Security 6.x 的普及,這個曾經的“老朋友”已經退出了歷史舞臺。

那么,我們為什么曾經需要覆蓋?WebSecurityConfigurerAdapter?如今又為什么不再需要(甚至不能)這樣做?理解這個演變過程,能幫助我們更好地掌握現代 Spring Security 的配置精髓。

“過去時”:為什么要覆蓋?WebSecurityConfigurerAdapter

在 Spring Security 5.7 版本之前,WebSecurityConfigurerAdapter?是官方推薦的配置入口。它是一個抽象類,通過繼承并覆蓋其內部的?configure?方法,開發者可以方便地自定義應用程序的安全策略。

選擇覆蓋它主要有以下三個原因,對應其三個核心的?configure?方法:

1. 配置 HTTP 安全策略 (configure(HttpSecurity http))

這是最常用、最重要的一個方法。覆蓋它,是為了定義哪些 URL 路徑需要被保護,以及如何保護

  • ??用途

    • ? 配置 URL 的訪問權限(如?antMatchers,?permitAll,?authenticated)。

    • ? 配置登錄方式(如表單登錄?formLogin()、HTTP Basic 認證)。

    • ? 配置登出行為 (logout())。

    • ? 配置 CSRF(跨站請求偽造)保護。

    • ? 配置 CORS(跨域資源共享)。

    • ? 管理會話(Session Management)。

  • ??經典示例代碼 (舊方式)
    @Configuration
    @EnableWebSecurity
    publicclassLegacySecurityConfigextendsWebSecurityConfigurerAdapter?{@Overrideprotectedvoidconfigure(HttpSecurity http)throws?Exception {http.authorizeRequests().antMatchers("/public/**",?"/login").permitAll()?// 公開路徑允許所有訪問.anyRequest().authenticated()?// 其他所有請求都需要認證.and().formLogin()?// 啟用表單登錄.loginPage("/login").defaultSuccessUrl("/dashboard").and().logout()?// 啟用登出.logoutSuccessUrl("/login?logout");}
    }
2. 配置認證管理器 (configure(AuthenticationManagerBuilder auth))

這個方法用于構建和配置**用戶認證(Authentication)**的方式,即回答“用戶是誰,以及如何驗證他們的身份”。

  • ??用途

    • ? 配置內存中的用戶 (inMemoryAuthentication),常用于開發和測試。

    • ? 配置基于數據庫的用戶 (jdbcAuthentication)。

    • ? 集成自定義的?UserDetailsService,從任何數據源(如數據庫、LDAP、外部API)加載用戶信息。

    • ? 指定密碼編碼器 (PasswordEncoder),如?BCryptPasswordEncoder

  • ??經典示例代碼 (舊方式)
    @Configuration
    // ... 其他注解
    publicclassLegacySecurityConfigextendsWebSecurityConfigurerAdapter?{@Autowiredprivate?UserDetailsService myUserDetailsService;@Beanpublic?PasswordEncoder?passwordEncoder()?{returnnewBCryptPasswordEncoder();}@Overrideprotectedvoidconfigure(AuthenticationManagerBuilder auth)throws?Exception {auth.userDetailsService(myUserDetailsService)?// 使用自定義的 UserDetailsService.passwordEncoder(passwordEncoder());?// 設置密碼編碼器}// ... configure(HttpSecurity http) 方法
    }
3. 配置全局 Web 安全 (configure(WebSecurity web))

此方法用于配置全局性的安全設置,通常是那些完全獨立于核心安全過濾器鏈的資源,例如靜態資源。

  • ??用途

    • ? 設置需要被安全過濾器忽略的路徑,如?/css/**,?/js/**,?/images/**。這可以提升性能,因為對這些資源的請求將不會經過 Spring Security 的復雜處理流程。

  • ??經典示例代碼 (舊方式)
    @Configuration
    // ... 其他注解
    publicclassLegacySecurityConfigextendsWebSecurityConfigurerAdapter?{@Overridepublicvoidconfigure(WebSecurity web)throws?Exception {web.ignoring().antMatchers("/css/**",?"/js/**",?"/images/**");}// ... 其他 configure 方法
    }

“現在時”:為什么不再使用?WebSecurityConfigurerAdapter

核心原因:WebSecurityConfigurerAdapter?自 Spring Security 5.7 起被標記為@Deprecated(過時),并在 Spring Security 6.0 (對應 Spring Boot 3.0) 中被完全移除。

Spring 團隊做出這個決定,是為了推動一種更現代化、更靈活的基于組件(Component-based)的配置方式

  • ??擁抱依賴注入和 IoC:新的方式不再依賴繼承和方法覆蓋,而是鼓勵開發者將安全配置定義為獨立的 Spring Bean。這更符合 Spring 的核心思想——控制反轉(IoC)。

  • ??配置解耦:每個安全相關的配置(如?SecurityFilterChain,?UserDetailsService,?PasswordEncoder)都是一個獨立的 Bean,職責更單一,更易于測試和管理。

  • ??提升清晰度和可維護性:通過顯式定義 Bean,配置的來源和作用一目了然,減少了因繼承帶來的“隱式”行為。

現代 Spring Security 配置方式 (The New Way)

那么,如何用現代的方式實現與上述三個?configure?方法相同的效果呢?

1. 替代?configure(HttpSecurity http)?-> 定義?SecurityFilterChain?Bean

這是最核心的變化。現在,我們通過定義一個?SecurityFilterChain?類型的 Bean 來配置 HTTP 安全。

  • ??現代示例代碼
    @Configuration
    @EnableWebSecurity
    publicclassModernSecurityConfig?{@Beanpublic?SecurityFilterChain?securityFilterChain(HttpSecurity http)throws?Exception {http.authorizeHttpRequests(authorize -> authorize.requestMatchers("/public/**",?"/login").permitAll()?// 使用 Lambda DSL 配置.anyRequest().authenticated()).formLogin(formLogin -> formLogin.loginPage("/login").defaultSuccessUrl("/dashboard")).logout(logout -> logout.logoutSuccessUrl("/login?logout"));return?http.build();}
    }
    注意:新的配置風格大量采用 Lambda DSL,代碼更緊湊、更具可讀性。
2. 替代?configure(AuthenticationManagerBuilder auth)?-> 定義獨立的認證組件 Bean

不再需要?AuthenticationManagerBuilder。Spring Security 會自動發現并使用我們定義的?UserDetailsService?和?PasswordEncoder?Bean。

  • ??現代示例代碼
    @Configuration
    publicclassModernSecurityConfig?{@Beanpublic?UserDetailsService?userDetailsService()?{// 以內存用戶為例UserDetailsuser=?User.builder().username("user").password(passwordEncoder().encode("password")).roles("USER").build();returnnewInMemoryUserDetailsManager(user);}@Beanpublic?PasswordEncoder?passwordEncoder()?{returnnewBCryptPasswordEncoder();}// ... SecurityFilterChain Bean
    }
3. 替代?configure(WebSecurity web)?-> 定義?WebSecurityCustomizer?Bean

為了忽略靜態資源,我們現在定義一個?WebSecurityCustomizer?類型的 Bean。

  • ??現代示例代碼
    @Configuration
    public?class?ModernSecurityConfig?{@Beanpublic?WebSecurityCustomizer?webSecurityCustomizer()?{return?(web) -> web.ignoring().requestMatchers("/css/**",?"/js/**",?"/images/**");}// ... 其他安全相關的 Bean
    }

新舊對比總結

任務

舊方式 (WebSecurityConfigurerAdapter)

新方式 (Component-based Beans)

HTTP 安全配置

覆蓋?configure(HttpSecurity http)

定義?SecurityFilterChain?Bean

用戶認證配置

覆蓋?configure(AuthenticationManagerBuilder auth)

定義?UserDetailsService?和?PasswordEncoder?Bean

忽略靜態資源

覆蓋?configure(WebSecurity web)

定義?WebSecurityCustomizer?Bean

結論

WebSecurityConfigurerAdapter?曾在 Spring Security 的發展中扮演了至關重要的角色,它提供了一種直觀、集中的方式來管理安全配置。然而,技術的演進使其讓位于一種更靈活、解耦且符合 Spring 核心理念的組件化配置模型

對于正在維護舊項目(Spring Boot 2.x)的開發者來說,理解?WebSecurityConfigurerAdapter?的工作原理仍然是有價值的。但對于所有新項目以及計劃升級到 Spring Boot 3.x 的項目而言,擁抱基于 Bean 的配置方式是必然的選擇。這種現代化的配置不僅能讓你的代碼更清晰、更易于維護,也是跟上 Spring 生態發展的正確路徑。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89960.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89960.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89960.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

web前端面試-- MVC、MVP、MVVM 架構模式對比

MVC、MVP、MVVM 架構模式對比 基本概念 這三種都是用于分離用戶界面(UI)與業務邏輯的架構模式,旨在提高代碼的可維護性、可測試性和可擴展性。 1. MVC (Model-View-Controller) 核心結構: Model:數據模型和業務邏輯View:用戶界面展…

【C#】MVVM知識點匯總-2

在C#中實現MVVM(Model-View-ViewModel)架構時,可以總結以下幾個關鍵知識點,并通過具體的代碼示例來進行說明。 1. 模型 (Model) 模型包含應用程序中的數據和業務邏輯。通常與數據庫交互。 public class User { public int Id {…

一文了解PMI、CSPM、軟考、、IPMA、PeopleCert和華為項目管理認證

1 引言 常見的項目管理方面的認證有PMI、IPMA、PeopleCert、CSPM、軟考和華為項目管理認證6個認證。本篇文章讓你一文了解各認證的基本主要內容。 2 核心定位 目前全球范圍內最具影響力的六大認證體系各有特色,源于不同的管理哲學和實踐背景。六大認證體系的核心…

bean注入的過程中,Property of ‘java.util.ArrayList‘ type cannot be injected by ‘List‘

一、問題 在spring實踐bean注入ArrayList屬性的時候報錯:Property of ‘java.util.ArrayList’ type cannot be injected by ‘List’二、原因分析 在嘗試將 Spring 配置中的 注入到一個 ArrayList 類型的屬性時出現了類型不匹配問題。核心問題在于:Spr…

自注意力機制原理: 向量矩陣案例進行說明

自注意力機制原理: 向量矩陣案例進行說明 目錄 自注意力機制原理: 向量矩陣案例進行說明一個單詞和所有單詞進行乘法運算,提取特征一、場景設定:翻譯句子“我喜歡深度學習”二、向量矩陣構建:以“我”為例計算自注意力三、矩陣視角:批量計算整個序列的自注意力四、向量矩…

D3 面試題100道之(61-80)

這里是D3的面試題,我們從第 61~80題 開始逐條解答。一共100道,陸續發布中。 ?? 面試題(第 61~80 題) 61. D3 中如何繪制餅圖? 使用 d3.pie() 生成角度數據,再結合 d3.arc() 創建路徑。 示例: const data = [10, 20, 30

flutter更改第三方庫pub get的緩存目錄;更改.gradle文件夾存放目錄

1.在目標目錄中新建文件夾flutter_pub_cache 2.在“用戶變量“或“系統變量”中點擊“新建” 變量名: PUB_CACHE 變量值: D:\flutter_pub_cache 3.打開新的終端運行或者從Android studio 控制臺運行:flutter pub cache repair或者flutter pub clean pub讀取新的變…

《Redis》哨兵模式

文章目錄 為什么要有哨兵模式呢?哨兵自動恢復故障主節點使用docker搭建分布式系統查看哨兵節點工作哨兵選舉新的主節點的流程 總結 為什么要有哨兵模式呢? 主從復制的問題 Redis 的主從復制模式可以將主節點的數據改變同步給從節點,這樣從節…

零基礎保姆級本地化部署文心大模型4.5開源系列

近兩年隨著大模型的迅猛崛起,吸引了各行各業的廣泛關注,更對我們的工作方式與生活產生著顯著積極影響。在這樣一個技術范式轉換的關鍵節點,百度文心大模型開源事件無疑具有里程碑意義——它不僅為中國自主研發的AI技術底座打開了通向世界的大…

【筆記】PyCharm 2025.2 EAP 創建 Poetry 和 Hatch 環境的踩坑實錄與反饋

https://youtrack.jetbrains.com/issue/PY-82407/Incorrect-Python-Version-and-Virtual-Environment-Path-When-Creating-Poetry-and-Hatch-Environments-via-GUI-in-PyCharm-2025.2-EAP 在 Python 開發的道路上,PyCharm 一直是我們信賴的開發利器。然而&#xff0…

ASP.NET Web Pages 安裝使用教程

一、ASP.NET Web Pages 簡介 ASP.NET Web Pages 是微軟推出的一種輕量級 Web 開發框架,適合快速開發動態網站。它使用 Razor 語法,可以將 HTML 與 C# 或 VB.NET 無縫融合,特別適合初學者和小型項目。 二、Web Pages 與 MVC 的區別 特性Web …

基于 ethers.js 的區塊鏈事件處理與錢包管理

幣圈工具箱 bqbot.cn 月訪問量達90whttps://bqbot.cn/jms.html (在線版地址) Event事件 檢索事件 const { ethers } require("hardhat"); async function SearchEvent() {try {const provider new ethers.JsonRpcProvider("http://1…

SpringBoot系列—入門

目錄 1 第一個SpringBoot程序 1.1 創建SpringBoot項目 1.2 選擇SpringBoot版本和必要依賴 1.3 項目目錄結構 1.4 編寫Hello World代碼 1.5 運行程序 1.6 不需要IDEA也能創建SpringBoot程序 1.7 部署程序 1.8 pom.xml依賴問題 1.9 無Maven選項問題 1.10 SpringBoot版…

你的Prompt還有很大提升

與AI協作,Prompt(提示詞)是溝通的橋梁。一個優秀的Prompt能讓AI的輸出事半功倍,而一個模糊的Prompt則可能導致南轅北轍的結果。如果你覺得AI的回答不夠精準、缺乏深度,或者總帶著一股“AI味”,那很可能是你…

3、Configuring Topics

如果您在應用程序上下文中定義了KafkaAdmin bean,它可以自動向代理添加主題。為此,您可以將每個主題的NewTopicBean添加到應用程序上下文中。2.3版本引入了一個新的類TopicBuilder,使創建此類bean更加方便。以下示例顯示了如何執行此操作&…

FastAPI+React19開發ERP系統實戰第04期

一、效果預覽 1.1 首頁 1.2 首頁暗黑模式 1.3 登錄頁 1.4 登錄頁暗黑模式 二、搭建React開發環境 2.1 項目依賴 package.json {"name": "erp-web","version": "1.0.0","description": "ERP系統前端 - React 19&quo…

數據庫|了解達夢數據庫并做安裝前的準備

哈嘍,你好啊,我是雷工! 你都用過哪些數據庫? 使用過的數據庫中覺得哪個數據庫最好用? 你使用過達夢數據庫嗎? 最近在做的一個SCADA項目,要求信創版本,其中數據庫也要使用信創目錄…

Java驅動AI革命:Spring AI八篇進階指南——從架構基礎到企業級智能系統實戰

系列文章目錄 提示:下面列出了整個系列的完整目錄,建議收藏本篇作為總覽入口:本人將在7月份更新完畢 第一篇:Spring AI 概述與架構設計 第二篇:Spring AI 基本組件詳解——ChatClient、Prompt、Memory 第三篇&#x…

hysAnalyser --- 支持菁彩視聽雙Vivid媒體信息解析

摘要 本文主要介紹 hysAnalyser 支持HDR Vivid格式的分析案例,滿足用戶分析HDR vivid 和 Audio Vivid格式的需要。 現將 hysAnalyser 新版本(v1.1.000)發布給網友使用,希望能幫助到更多音視頻開發的愛好者。使用過程中,若遇到問題請您通過 G…

C++中NULL等于啥

文章目錄 **一、`NULL` 的標準定義****二、常見實現方式**1. **定義為整數 `0`**2. **定義為 `0L` 或 `(void*)0`**(較少見)**三、與C語言的關鍵區別****四、`NULL` 在C++中的問題**1. **重載函數匹配歧義**2. **模板參數推導錯誤****五、C++11+ 的替代方案:`nullptr`****六…