图片

对于许多经验丰富的 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 的访问权限(如 antMatcherspermitAllauthenticated)。

    • • 配置登录方式(如表单登录 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)。

  • • 配置解耦:每个安全相关的配置(如 SecurityFilterChainUserDetailsServicePasswordEncoder)都是一个独立的 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`****六…