Spring Security即将弃用配置类WebSecurityConfigurerAdapter

efd4900a2b6c89834f20b3b68fc4a71d.gif

2022年的开工福利已经发布,点击下面按钮获取最新PDF。

[这里是图片002]

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

433e27629a9f5344be655bc7ba3ba601.png

相关的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.authorizeHttpRequestspermitAll来实现。

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,不限制数量,但是要注意有排序问题。相关的思维导图:

dc5ae58e377e91a781efaba54ee30634.png

最后

很多技术方案都不是直接更改的,是会有一个变化的过程,只要你紧追变化,其实也就没有变化。这一篇是不是学会了不少呢?欢迎留言发表看法,当然点赞再看也不能少哦。

Spring Security的内置过滤器是如何维护的

2022-02-21

[这里是图片005]

附DEMO| 绝活!Spring Security过滤器就该这么配置

2022-02-16

[这里是图片006]

OAuth2授权服务器Keycloak宣布不再适配Spring Boot和Spring Security

2022-02-15

[这里是图片007]

f4815fa40ba165ad8f32a0151bd0e39e.gif

7b3ac252dbba46549694cdab0e16652d.png

猜你喜欢

转载自blog.csdn.net/m0_67391377/article/details/125243289