0


Spring Security - 如何修复 WebSecurityConfigurerAdapter 已弃用

在这篇简短的文章中,我想分享如何摆脱在带有Spring Security的基于Spring的应用程序中的“WebSecurityConfigurerAdapter类型已被弃用”的警告。也许你习惯于有一个Spring配置类来扩展WebSecurityConfigurerAdapter抽象类,如下所示:这对于Spring Security版本5.6.5或更早版本,或者Spring Boot版本2.6.8或更早版本很好。但是,如果您的项目使用 Spring Security 5.7.1 或更高版本,或者 Spring Boot 2.7.0 或更高版本,您将在 IDE 中收到以下警告:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

@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...
        
    
}      
}

WebSecurityConfigurerAdapter 类型已弃用

那么,为什么Spring Security不推荐使用WebSecurityConfigurerAdapter呢?,还有什么替代方案呢?这是因为Spring框架的开发人员鼓励用户转向基于组件的安全配置。因此,与其像旧方式那样扩展WebSecurityConfigurerAdapter并覆盖用于配置 HttpSecurity 和 WebSecurity 的方法 - 现在您声明两个类型为SecurityFilterChain和WebSecurityCustomizer的 bean,如下所示:供您参考,下面是将安全配置迁移到基于组件的方法的代码示例。首先,让我们看一下使用 WebSecurityConfigurerAdapter 的典型安全配置类,如下所示:下面是一个替代方案,没有WebSecurityConfigurerAdapter:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

@Configuration
@EnableWebSecurity
public
class
WebSecurityConfig 
extends
WebSecurityConfigurerAdapter {
    
@Bean
    
public
UserDetailsService userDetailsService() {
        
return
new
ShopmeUserDetailsService();
    
}
    
@Bean
    
public
BCryptPasswordEncoder passwordEncoder() {
        
return
new
BCryptPasswordEncoder();
    
}
    
    
@Override
    
protected
void
configure(HttpSecurity http) 
throws
Exception {
        
http.authorizeRequests().antMatchers(
"/login"
).permitAll()
                
.antMatchers(
"/users/**"
, 
"/settings/**"
).hasAuthority(
"Admin"
)
                
.hasAnyAuthority(
"Admin"
, 
"Editor"
, 
"Salesperson"
)
                
.hasAnyAuthority(
"Admin"
, 
"Editor"
, 
"Salesperson"
, 
"Shipper"
)
                
.anyRequest().authenticated()
                
.and().formLogin()
                
.loginPage(
"/login"
)
                    
.usernameParameter(
"email"
)
                    
.permitAll()
                
.and()
                
.rememberMe().key(
"AbcdEfghIjklmNopQrsTuvXyz_0123456789"
)
                
.and()
                
.logout().permitAll();
        
http.headers().frameOptions().sameOrigin();
    
}
    
    
@Override
    
public
void
configure(WebSecurity web) 
throws
Exception {
        
web.ignoring().antMatchers(
"/images/**"
, 
"/js/**"
, 
"/webjars/**"
); 
    
}
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

package
net.codejava;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.context.annotation.Bean;
import
org.springframework.security.config.annotation.web.builders.HttpSecurity;
import
org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import
org.springframework.security.core.userdetails.UserDetailsService;
import
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import
org.springframework.security.web.SecurityFilterChain;
@Configuration
public
class
SecurityConfiguration {
    
@Bean
    
public
UserDetailsService userDetailsService() {
        
return
new
ShopmeUserDetailsService();
    
}
    
@Bean
    
public
BCryptPasswordEncoder passwordEncoder() {
        
return
new
BCryptPasswordEncoder();
    
}
    
@Bean
    
public
SecurityFilterChain filterChain(HttpSecurity http) 
throws
Exception {
    
        
http.authorizeRequests().antMatchers(
"/login"
).permitAll()
                
.antMatchers(
"/users/**"
, 
"/settings/**"
).hasAuthority(
"Admin"
)
                
.hasAnyAuthority(
"Admin"
, 
"Editor"
, 
"Salesperson"
)
                
.hasAnyAuthority(
"Admin"
, 
"Editor"
, 
"Salesperson"
, 
"Shipper"
)
                
.anyRequest().authenticated()
                
.and().formLogin()
                
.loginPage(
"/login"
)
                    
.usernameParameter(
"email"
)
                    
.permitAll()
                
.and()
                
.rememberMe().key(
"AbcdEfghIjklmNopQrsTuvXyz_0123456789"
)
                
.and()
                
.logout().permitAll();
        
http.headers().frameOptions().sameOrigin();
        
return
http.build();
    
}
    
@Bean
    
public
WebSecurityCustomizer webSecurityCustomizer() {
        
return
(web) -> web.ignoring().antMatchers(
"/images/**"
, 
"/js/**"
, 
"/webjars/**"
);
    
}
}

声明一个类型为 AuthenticationManager 的 Bean:

如果您需要公开AuthenticationManager 类型的 Bean,您可以输入以下代码:

1

2

3

4

5

@Bean
public
AuthenticationManager authenticationManager(
        
AuthenticationConfiguration authConfig) 
throws
Exception {
    
return
authConfig.getAuthenticationManager();
}

声明一个 AuthenticationProvider 类型的 bean:

如果您需要公开 AuthenticationProvider 类型的 Bean,例如DaoAuthenticationProvider,请使用以下代码:并在SecurityFilterChain的代码中为 HttpSecurity 指定此身份验证提供程序,如下所示:这就是在具有 Spring 安全性的基于 Spring 的应用程序中删除警告“WebSecurityConfigurerAdapter 已弃用”的警告的方法。您需要声明SecurityFilterChain和 WebSecurityCustomizer bean,而不是覆盖WebSecurityConfigurerAdapter类的方法。注意:如果您不想更改当前代码,则应保持 Spring 引导版本低于 2.7.0 或 Spring Security 版本低于 5.7.1。我希望这篇文章对您有所帮助。感谢您的阅读。参考:没有 WebSecurityConfigurerAdapter 的 Spring 安全性

1

2

3

4

5

6

7

8

9

@Bean
public
DaoAuthenticationProvider authenticationProvider() {
    
DaoAuthenticationProvider authProvider = 
new
DaoAuthenticationProvider();
    
    
authProvider.setUserDetailsService(userDetailsService());
    
authProvider.setPasswordEncoder(passwordEncoder());
    
return
authProvider;
}

1

http.authenticationProvider(authenticationProvider());
标签: spring java 后端

本文转载自: https://blog.csdn.net/allway2/article/details/127781633
版权归原作者 allway2 所有, 如有侵权,请联系我们删除。

“Spring Security - 如何修复 WebSecurityConfigurerAdapter 已弃用”的评论:

还没有评论