原文链接: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. 京东云PostgreSQL在GIS场景的应用分享

    在地图或地理信息有关的场景里,地址关键词的检索尤其重要.比如打开百度地图,想要查询某个位置的信息"北京市海淀区清华东路17号中国农业大学",往往我们输入的是关键词"中国农 ...

  2. CodeForces - 1690F

    Problem - F - Codeforces 题意: 给出一个字符串,给出一个序列,每次对应位置的字符变成序列指定位置的字符,即序列中对应位置为2,那么字符串的这个位置的字符就要变成字符串第二个位 ...

  3. AtCoder Beginner Contest 254(D-E)

    Tasks - AtCoder Beginner Contest 254 D - Together Square 题意: 给定一个N,找出所有不超过N的 ( i , j ),使得( i * j )是一 ...

  4. An iOS zero-click radio proximity exploit odyssey

    NOTE: This specific issue was fixed before the launch of Privacy-Preserving Contact Tracing in iOS 1 ...

  5. 食之无味?App Startup 可能比你想象中要简单

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...

  6. KingbaseES 如何实现Oracle pipelined 功能

    管道函数即是可以返回行集合(可以使嵌套表nested table 或数组 varray)的函数,我们可以像查询物理表一样查询它或者将其赋值给集合变量.KingbaseES 数据库可以用 setof 实 ...

  7. Linux_more_less总结

    先写结论 : less is more,使用less 优于使用more more 和 less的区别 优于more不能后退,而less 就在其基础上增加了后退功能 less 可以使用键盘上的上下方向键 ...

  8. axos在async模式下如何中断请求

    main.js import axios from 'axios' Vue.prototype.$http = axios Test.vue <template> <div clas ...

  9. windows下 Rust 环境配置

    搭建 Visual Studio Code 开发环境 首先,需要安装最新版的 Rust 编译工具和 Visual Studio Code. Rust 编译工具:https://www.rust-lan ...

  10. Kibana:运用索引模式的 formatter 来探索 IP 信息

    文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/107484674