原文链接:Spring Security - How to Fix WebSecurityConfigurerAdapter Deprecated

原文作者:Nam Ha Minh

原文发表日期:2022年6月1日

在这篇短文中,我想分享如何在使用Spring Security的Spring应用中避免“WebSecurityConfigurerAdapter类已被弃用”的警告。

也许你习惯于使用一个扩展自WebSecurityConfigurerAdapter抽象类的Spring配置类,就像这样:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override
protected void configure(HttpSecurity http) throws Exception {
// configure HTTP security...
} @Override
public void configure(WebSecurity web) throws Exception {
// configure Web security...
}
}

这在Spring Security 5.6.5及更旧版本或Spring Boot 2.6.8及更旧版本没有问题。然而,如果你的项目使用Spring Security 5.7.1及更新版本或者Spring Boot 2.7.0及更新版本,你的IDE会警告你:

类WebSecurityConfigurerAdapter已被弃用

那么,为什么Spring Security弃用了WebSecurityConfigurerAdapter?它的继任者是什么?

这是因为Spring框架的开发者鼓励用户使用基于组件的(component-based)的安全配置。

在以前的用法中,我们扩展WebSecurityConfigurerAdapter类并且覆盖配置HttpSecurity和WebSecurity的方法;在新的用法中,我们得分别声明类型为SecurityFilterChain和WebSecurityCustomizer的bean,就像下面这样:

@Configuration
public class SecurityConfiguration { @Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { } @Bean
public WebSecurityCustomizer webSecurityCustomizer() { } }

下面是从旧的安全配置转向基于组件的配置的代码示例。首先,让我们看看典型的扩展自WebSecurityConfigurerAdapter的安全配置类,如下所示:

 1 @Configuration
2 @EnableWebSecurity
3 public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
4
5 @Bean
6 public UserDetailsService userDetailsService() {
7 return new ShopmeUserDetailsService();
8 }
9
10 @Bean
11 public BCryptPasswordEncoder passwordEncoder() {
12 return new BCryptPasswordEncoder();
13 }
14
15 @Override
16 protected void configure(HttpSecurity http) throws Exception {
17 http.authorizeRequests().antMatchers("/login").permitAll()
18 .antMatchers("/users/**", "/settings/**").hasAuthority("Admin")
19 .hasAnyAuthority("Admin", "Editor", "Salesperson")
20 .hasAnyAuthority("Admin", "Editor", "Salesperson", "Shipper")
21 .anyRequest().authenticated()
22 .and().formLogin()
23 .loginPage("/login")
24 .usernameParameter("email")
25 .permitAll()
26 .and()
27 .rememberMe().key("AbcdEfghIjklmNopQrsTuvXyz_0123456789")
28 .and()
29 .logout().permitAll();
30
31 http.headers().frameOptions().sameOrigin();
32 }
33
34 @Override
35 public void configure(WebSecurity web) throws Exception {
36 web.ignoring().antMatchers("/images/**", "/js/**", "/webjars/**");
37 }
38 }

下面是不使用WebSecurityConfigurerAdapter的新的安全配置:

 1 package net.codejava;
2
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.context.annotation.Bean;
5 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
6 import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
7 import org.springframework.security.core.userdetails.UserDetailsService;
8 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
9 import org.springframework.security.web.SecurityFilterChain;
10
11 @Configuration
12 public class SecurityConfiguration {
13
14 @Bean
15 public UserDetailsService userDetailsService() {
16 return new ShopmeUserDetailsService();
17 }
18
19 @Bean
20 public BCryptPasswordEncoder passwordEncoder() {
21 return new BCryptPasswordEncoder();
22 }
23
24 @Bean
25 public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
26 http.authorizeRequests().antMatchers("/login").permitAll()
27 .antMatchers("/users/**", "/settings/**").hasAuthority("Admin")
28 .hasAnyAuthority("Admin", "Editor", "Salesperson")
29 .hasAnyAuthority("Admin", "Editor", "Salesperson", "Shipper")
30 .anyRequest().authenticated()
31 .and().formLogin()
32 .loginPage("/login")
33 .usernameParameter("email")
34 .permitAll()
35 .and()
36 .rememberMe().key("AbcdEfghIjklmNopQrsTuvXyz_0123456789")
37 .and()
38 .logout().permitAll();
39
40 http.headers().frameOptions().sameOrigin();
41
42 return http.build();
43 }
44
45 @Bean
46 public WebSecurityCustomizer webSecurityCustomizer() {
47 return (web) -> web.ignoring().antMatchers("/images/**", "/js/**", "/webjars/**");
48 }

以上就是如何在使用的Spring Security的Spring应用中避免“类WebSecurityConfigurerAdapter已被弃用”的警告的方法。你需要声明SecurityFilterChain和WebSecurityCustomizer两个bean而不是覆盖WebSecurityConfigurerAdapter类的方法。

注意:如果你不想修改你现在的代码,那么你的的Spring Boot版本应该低于2.7.0、Spring Security版本低于5.7.1。

我希望这篇文章能帮助到你,感谢阅读。

参考资料:Spring Security without the WebSecurityConfigurerAdapter

【翻译】Spring Security - 如何解决WebSecurityConfigurerAdapter类已被弃用的问题?的更多相关文章

  1. 【翻译】Spring Security抛弃了WebSecurityConfigurerAdapter

    原文链接:Spring Security without the WebSecurityConfigurerAdapter 作者:ELEFTHERIA STEIN-KOUSATHANA 发表日期:20 ...

  2. 通过 Spring Security配置 解决X-Frame-Options deny 造成的页面空白 iframe调用问题

    spring Security下,X-Frame-Options默认为DENY,非Spring Security环境下,X-Frame-Options的默认大多也是DENY,这种情况下,浏览器拒绝当前 ...

  3. Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】

    源码请移步至:https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc 版 ...

  4. Spring Security(一):官网向导翻译

    原文出自  https://spring.io/guides/topicals/spring-security-architecture Spring Security Architecture   ...

  5. spring security入门demo

    一.前言 因项目需要引入spring security权限框架,而之前也没接触过这个一门,于是就花了点时间弄了个小demo出来,说实话,刚开始接触这个确实有点懵,看网上资料写的权限大都是静态,即就是在 ...

  6. SpringBoot第二十三篇:安全性之Spring Security

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11350255.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   系统的安全 ...

  7. Java安全框架(一)Spring Security

    Java安全框架(一)Spring Security ​ 文章主要分三部分 1.Spring Security的架构及核心组件:(1)认证:(2)权限拦截:(3)数据库管理:(4)权限缓存:(5)自定 ...

  8. 深入Spring Security魔幻山谷-获取认证机制核心原理讲解(新版)

    文/朱季谦 本文基于Springboot+Vue+Spring Security框架而写的原创学习笔记,demo代码参考<Spring Boot+Spring Cloud+Vue+Element ...

  9. Spring Security 之基本概念

    Spring Security 是一个安全框架, 可以简单地认为 Spring Security 是放在用户和 Spring 应用之间的一个安全屏障, 每一个 web 请求都先要经过 Spring S ...

随机推荐

  1. C#基础_变量的命名规则

    变量: 1.作用 :可以让我们在计算机中存储数据 2.语法:变量类型    变量名=赋值: 3.常用的数据类型:  int   整数类型  取值范围:最大2147483647;最小-214748364 ...

  2. 【c语言学习】1 基础环境安装调试

    1-1下载 vs2019 vs2019下载链接https://visualstudio.microsoft.com/zh-hans/vs/community/ 1-2安装配置环境 记得勾选上c++开发 ...

  3. KingbaseES DENSE_RANK 函数用法

    DENSE_RANK()函数用于为结果集分区内的每一行分配一个排名,排名值之间没有差距,函数为结果集的每个分区中的每一行分配一个等级. 与 RANK() 函数不同的是,DENSE_RANK() 函数总 ...

  4. Grafana Mimir:支持乱序的指标采集

    Grafana Mimir:支持乱序的指标采集 译自:New in Grafana Mimir: Introducing out-of-order sample ingestion 很早之前在使用th ...

  5. Redis的web管理界面redis-manager

    下载 下载地址:https://github.com/ngbdf/redis-manager/releases 配置 tar -zxv -f redis-manager-2.3.2.2-RELEASE ...

  6. 2>&1到底是什么意思?

    java -jar snapshot.jar > snapshot.log 2>&1 & 写Java的朋友一定对上面的命令很熟悉,相信大部分人都知道>表示的是重定向, ...

  7. Java基础之变量

    Java基础之变量 目录 Java基础之变量 1.变量概述 1.1 为什么需要变量 1.2 简单理解 1.3 变量使用注意事项 1.4 程序中+号的使用 1.5 Java数据类型 1.6 整数类型 1 ...

  8. [题解] Atcoder ABC 225 H Social Distance 2 生成函数,分治FFT

    题目 首先还没有安排座位的\(m-k\)个人之间是有顺序的,所以先把答案乘上\((m-k)!\),就可以把这些人看作不可区分的. 已经确定的k个人把所有座位分成了k+1段.对于第i段,如果我们能求出这 ...

  9. sql中更换函数REPLACE

    update <表名> ser <更换的列名> replace(<更换的列名>,'<更换前的对象>','<更换后的对象>') 例 updat ...

  10. Future详解

    Future模式 [1]Future模式是多线程开发中常见的设计模式,它的核心思想是异步调用.对于Future模式来说,它无法立即返回你需要的数据,但是它会返回一个契约,将来你可以凭借这个契约去获取你 ...