Spring Security 即将弃用配置类 WebSecurityConfigurerAdapter

开发 架构
Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。提供了完善的认证机制和方法级的授权功能。是一款非常优秀的权限管理框架。

用过WebSecurityConfigurerAdapter的都知道对Spring Security十分重要,总管Spring Security的配置体系。但是马上这个类要废了,你没有看错,这个类将在5.7版本被@Deprecated所标记了,未来这个类将被移除。

相关的issues已经被处理并关闭

对此对此网友大呼“学着学着就被弃用了”。既然马上要启用了,总要有个过渡方案或者新玩法吧。

早在2021年3月份胖哥就写了一篇文章,把新玩法给明明白白说清楚了,如果你看了的话,肯定不会学废弃技术。这里把整套的替代方案再搞一遍,可别再学过时技术了。

版本需要Spring Security 5.4.x及以上。

HttpSecurity新旧玩法对比

旧玩法:

@Configuration
static class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**")
.authorizeRequests(authorize -> authorize
.anyRequest().authenticated()
);
}
}

新玩法:

@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.antMatcher("/**")
.authorizeRequests(authorize -> authorize
.anyRequest().authenticated()
)
.build();
}

WebSecurity新旧玩法对比

使用WebSecurity.ignoring()忽略某些URL请求,这些请求将被Spring Security忽略,这意味着这些URL将有受到 CSRF、XSS、Clickjacking 等攻击的可能。以下示例仅仅作为演示,请勿使用在生产环境。是不是又学到了呢?

旧玩法:

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Override
public void configure(WebSecurity web) {
// 仅仅作为演示
web.ignoring().antMatchers("/ignore1", "/ignore2");
}

}

新玩法:

@Configuration
public class SecurityConfiguration {

@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
// 仅仅作为演示
return (web) -> web.ignoring().antMatchers("/ignore1", "/ignore2");
}

}

如果你需要忽略URL,请考虑通过HttpSecurity.authorizeHttpRequests的permitAll来实现。

AuthenticationManager新旧玩法对比

AuthenticationManager配置主要分为全局的(Global )、本地的(Local)。

旧玩法

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication();
}
}

上面是通过WebSecurityConfigurerAdapter开启的是本地配置。开启全局配置需要覆写其authenticationManagerBean()方法并标记为Bean:

       @Bean(name name="myAuthenticationManager")
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}

新玩法

本地配置通过HttpSecurity.authenticationManager实现:

@Configuration
public class SecurityConfiguration {

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults())
.authenticationManager(new CustomAuthenticationManager());
}

}

全局配置摆脱了依赖WebSecurityConfigurerAdapter.authenticationManagerBean()方法,只需要定义一个AuthenticationManager类型的Bean即可:

    @Bean
AuthenticationManager ldapAuthenticationManager(
BaseLdapPathContextSource contextSource) {
LdapBindAuthenticationManagerFactory factory =
new LdapBindAuthenticationManagerFactory(contextSource);
factory.setUserDnPatterns("uid={0},ou=people");
factory.setUserDetailsContextMapper(new PersonContextMapper());
return factory.createAuthenticationManager();
}

当然还可以通过自定义GlobalAuthenticationConfigurerAdapter并注入Spring IoC来修改AuthenticationManagerBuilder,不限制数量,但是要注意有排序问题。相关的思维导图:

最后

很多技术方案都不是直接更改的,是会有一个变化的过程,只要你紧追变化,其实也就没有变化。这一篇是不是学会了不少呢?


责任编辑:武晓燕 来源: 码农小胖哥
相关推荐

2023-04-10 11:41:15

2022-01-26 11:08:07

Kubernetes容器dockershim

2024-02-02 09:08:32

2015-07-23 18:17:08

Windows 10微软功能

2024-09-30 10:11:04

2020-12-03 18:29:30

KubernetesDocker容器

2024-10-17 14:14:29

2021-08-06 06:51:16

适配器配置Spring

2021-04-23 07:33:10

SpringSecurity单元

2021-08-29 18:36:57

项目

2022-02-16 23:58:41

Spring过滤器验证码

2020-12-18 07:34:48

Spring配置文件

2022-04-18 07:42:31

配置机制Spring

2023-09-22 16:54:42

GNOME 45系统

2021-06-04 05:21:19

KubernetesDocker容器

2022-04-08 16:14:21

FedoraBIOS32 位操作系统

2024-06-27 13:45:21

2022-06-03 09:41:03

DockerKubernetes容器

2011-03-23 09:40:37

Google GearChrome

2023-10-12 07:46:02

点赞
收藏

51CTO技术栈公众号