【翻译】Spring Security - 如何解决WebSecurityConfigurerAdapter类已被弃用的问题?
原文链接: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类已被弃用的问题?的更多相关文章
- 【翻译】Spring Security抛弃了WebSecurityConfigurerAdapter
原文链接:Spring Security without the WebSecurityConfigurerAdapter 作者:ELEFTHERIA STEIN-KOUSATHANA 发表日期:20 ...
- 通过 Spring Security配置 解决X-Frame-Options deny 造成的页面空白 iframe调用问题
spring Security下,X-Frame-Options默认为DENY,非Spring Security环境下,X-Frame-Options的默认大多也是DENY,这种情况下,浏览器拒绝当前 ...
- Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】
源码请移步至:https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc 版 ...
- Spring Security(一):官网向导翻译
原文出自 https://spring.io/guides/topicals/spring-security-architecture Spring Security Architecture ...
- spring security入门demo
一.前言 因项目需要引入spring security权限框架,而之前也没接触过这个一门,于是就花了点时间弄了个小demo出来,说实话,刚开始接触这个确实有点懵,看网上资料写的权限大都是静态,即就是在 ...
- SpringBoot第二十三篇:安全性之Spring Security
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11350255.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 系统的安全 ...
- Java安全框架(一)Spring Security
Java安全框架(一)Spring Security 文章主要分三部分 1.Spring Security的架构及核心组件:(1)认证:(2)权限拦截:(3)数据库管理:(4)权限缓存:(5)自定 ...
- 深入Spring Security魔幻山谷-获取认证机制核心原理讲解(新版)
文/朱季谦 本文基于Springboot+Vue+Spring Security框架而写的原创学习笔记,demo代码参考<Spring Boot+Spring Cloud+Vue+Element ...
- Spring Security 之基本概念
Spring Security 是一个安全框架, 可以简单地认为 Spring Security 是放在用户和 Spring 应用之间的一个安全屏障, 每一个 web 请求都先要经过 Spring S ...
随机推荐
- C#基础_变量的命名规则
变量: 1.作用 :可以让我们在计算机中存储数据 2.语法:变量类型 变量名=赋值: 3.常用的数据类型: int 整数类型 取值范围:最大2147483647;最小-214748364 ...
- 【c语言学习】1 基础环境安装调试
1-1下载 vs2019 vs2019下载链接https://visualstudio.microsoft.com/zh-hans/vs/community/ 1-2安装配置环境 记得勾选上c++开发 ...
- KingbaseES DENSE_RANK 函数用法
DENSE_RANK()函数用于为结果集分区内的每一行分配一个排名,排名值之间没有差距,函数为结果集的每个分区中的每一行分配一个等级. 与 RANK() 函数不同的是,DENSE_RANK() 函数总 ...
- Grafana Mimir:支持乱序的指标采集
Grafana Mimir:支持乱序的指标采集 译自:New in Grafana Mimir: Introducing out-of-order sample ingestion 很早之前在使用th ...
- Redis的web管理界面redis-manager
下载 下载地址:https://github.com/ngbdf/redis-manager/releases 配置 tar -zxv -f redis-manager-2.3.2.2-RELEASE ...
- 2>&1到底是什么意思?
java -jar snapshot.jar > snapshot.log 2>&1 & 写Java的朋友一定对上面的命令很熟悉,相信大部分人都知道>表示的是重定向, ...
- Java基础之变量
Java基础之变量 目录 Java基础之变量 1.变量概述 1.1 为什么需要变量 1.2 简单理解 1.3 变量使用注意事项 1.4 程序中+号的使用 1.5 Java数据类型 1.6 整数类型 1 ...
- [题解] Atcoder ABC 225 H Social Distance 2 生成函数,分治FFT
题目 首先还没有安排座位的\(m-k\)个人之间是有顺序的,所以先把答案乘上\((m-k)!\),就可以把这些人看作不可区分的. 已经确定的k个人把所有座位分成了k+1段.对于第i段,如果我们能求出这 ...
- sql中更换函数REPLACE
update <表名> ser <更换的列名> replace(<更换的列名>,'<更换前的对象>','<更换后的对象>') 例 updat ...
- Future详解
Future模式 [1]Future模式是多线程开发中常见的设计模式,它的核心思想是异步调用.对于Future模式来说,它无法立即返回你需要的数据,但是它会返回一个契约,将来你可以凭借这个契约去获取你 ...