AI智能
改变未来

Spring Security即将弃用WebSecurityConfigurerAdapter配置类

用过

WebSecurityConfigurerAdapter

的都知道对Spring Security十分重要,总管Spring Security的配置体系。但是马上这个类要废了,你没有看错,这个类将在5.7版本被

@Deprecated

所标记了,未来这个类将被移除。

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

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

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

HttpSecurity新旧玩法对比

旧玩法:

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

新玩法:

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

原理去看这一篇文章。

WebSecurity新旧玩法对比

使用

WebSecurity.ignoring()

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

旧玩法:

@Configurationpublic class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overridepublic void configure(WebSecurity web) {// 仅仅作为演示web.ignoring().antMatchers("/ignore1", "/ignore2");}}

新玩法:

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

如果你需要忽略URL,请考虑通过

HttpSecurity.authorizeHttpRequests

permitAll

来实现。

AuthenticationManager新旧玩法对比

AuthenticationManager

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

旧玩法

@Configurationpublic class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.jdbcAuthentication();}}

上面是通过

WebSecurityConfigurerAdapter

开启的是本地配置。开启全局配置需要覆写其

authenticationManagerBean()

方法并标记为Bean:

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

新玩法

本地配置通过

HttpSecurity.authenticationManager

实现:

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

全局配置摆脱了依赖

WebSecurityConfigurerAdapter.authenticationManagerBean()

方法,只需要定义一个

AuthenticationManager

类型的Bean即可:

@BeanAuthenticationManager 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

,不限制数量,但是要注意有排序问题。相关的思维导图:

最后

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

关注公众号:Felordcn 获取更多资讯

个人博客:https://felord.cn

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Spring Security即将弃用WebSecurityConfigurerAdapter配置类