原文链接: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. idea中无法在@Test 之下使用Scanner

    //如何解决idea中无法在 @Test 之下使用Scanner@Testpublic void testInsert(){ Scanner scanner = new Scanner(System. ...

  2. ELK技术-IK-中文分词器

    1.背景 1.1 简介 ES默认的分词器对中文分词并不友好,所以一般会安装中文分词插件,以便能更好的支持中文分词检索. 本例参考文档:<一文教你掌握IK中文分词> 1.2 IK分词器 IK ...

  3. KingbaseES where 条件解析顺序

    概述 KingbaseES 对于where 条件的解析严格遵守"从左到右"的原则,因此,对于选择性比较强的条件,进行最先过滤是有利于性能的. 一.KingbaseES 1.条件顺序 ...

  4. [Python]-numpy模块-机器学习Python入门《Python机器学习手册》-01-向量、矩阵和数组

    <Python机器学习手册--从数据预处理到深度学习> 这本书类似于工具书或者字典,对于python具体代码的调用和使用场景写的很清楚,感觉虽然是工具书,但是对照着做一遍应该可以对机器学习 ...

  5. keycloak~资源的远程授权

    17.1远程资源授权准备 17.1.1认证和访问流程图 参考:http://www.zyiz.net/tech/detail-141309.html 17.1.2为用户指定角色 可以使用ROLE_US ...

  6. MySQL DDL执行方式-Online DDL介绍

    1 引言 大家好,今天与大家一起分享一下 mysql DDL执行方式. 一般来说MySQL分为DDL(定义)和DML(操作). DDL:Data Definition Language,即数据定义语言 ...

  7. MySQL集群搭建(3)-MMM高可用架构

    1 MMM 介绍 1.1 简介 MMM 是一套支持双主故障切换以及双主日常管理的第三方软件.MMM 由 Perl 开发,用来管理和监控双主复制,虽然是双主架构,但是业务上同一时间只允许一个节点进行写入 ...

  8. Logstash:解析 JSON 文件并导入到 Elasticsearch 中

    转载自:https://elasticstack.blog.csdn.net/article/details/114383426 在今天的文章中,我们将详述如何使用 Logstash 来解析 JSON ...

  9. frps服务端与nginx可共用443端口

    转载自: https://www.ioiox.com/archives/78.html frps服务器上的nginx frps.ini配置 由于nginx占用80/443端口,frps.ini中的 v ...

  10. PostgreSQL 删除数据库

    PostgreSQL 删除数据库可以用以下三种方式: 1.使用 DROP DATABASE SQL 语句来删除. 2.使用 dropdb 命令来删除. 3.使用 pgAdmin 工具. 注意:删除数据 ...