【翻译】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 ...
随机推荐
- vue-router4 |name的作用|query传参|parmas传参|动态路由参数|命名视图|别名alias|前置路由守卫|路由过渡效果|滚动行为
vue-router4 出现 No match found for location with path "/" #### router/index.ts文件 import { c ...
- k8s手动扩缩容
1. 查询deploy副本数,ready数表示副本数 kubectl get deploy 2.通过命令直接扩容或者缩容,--replicas=1表示把my-dep缩容到副本数1,--replicas ...
- 第七十四篇:Vue组件父子传值
好家伙, 1.组件之间的关系 在项目开发中,组件之间的最常见关系分为如下两种: (1)父子关系 (2)兄弟关系 2.父子之间的数据共享 (1)父->子共享数据 父组件向子组件共享数据需要使用自定 ...
- 面试~jvm(JVM内存结构、类加载、双亲委派机制、对象分配,了解垃圾回收)
一.JVM内存结构 ▷ 谈及内存结构各个部分的数据交互过程:还可以再谈及生命周期.数据共享:是否GC.是否OOM 答:jvm 内存结构包括程序计数器.虚拟机栈.本地方法栈.堆.方法区:它是字节码运行时 ...
- 二极管1N4148和1N4007的区别
二极管1N4148和1N4007的定义 1N4148 是开关二极管,耐压100V,电流150mA,反向恢复速度快,为nS级别. 1N4007 是普通整流二极管,耐压1000V,电流1A ,反向恢复时间 ...
- SpringBoot源码学习1——SpringBoot自动装配源码解析+Spring如何处理配置类的
系列文章目录和关于我 一丶什么是SpringBoot自动装配 SpringBoot通过SPI的机制,在我们程序员引入一些starter之后,扫描外部引用 jar 包中的META-INF/spring. ...
- 100个Linux Shell脚本经典案例(附PDF)
转载自:https://mp.weixin.qq.com/s/tCKAM67_7K7q2vJthaIsDQ 原文链接:https://wenku.baidu.com/view/4f089430a116 ...
- 移除worker节点
1.在准备移除的 worker 节点上执行 kubeadm reset -f 2.在 master 节点上执行 kubectl get nodes -o wide 3.删除worker节点,在 mas ...
- Go的网络编程详解
一 互联网协议介绍 1.1互联网分层模型 互联网的逻辑实现被分为好几层.每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持.用户接触到的只是最上面的那一层,根本不会感觉到下面的几层.要理解互联 ...
- MatrixOne从入门到实战04——MatrixOne的连接和建表
MatrixOne从入门到实战--MatrixOne的连接和建表 前景回顾 前几篇文章,为大家介绍了MatrixOne这个产品,以及编译.部署MatrixOne的服务. 直通车: MatrixOne从 ...