快捷搜索:  汽车  科技

spring security框架用得多吗(用的挺顺手的SpringSecurity)

spring security框架用得多吗(用的挺顺手的SpringSecurity)旧玩法:版本需要Spring Security 5.4.x及以上。对此对此网友大呼“学着学着就被弃用了”。既然马上要弃用了,总要有个过渡方案或者新玩法吧。早在2021年3月份胖哥就写了一篇文章,把新玩法给明明白白说清楚了,如果你看了的话,肯定不会学废弃技术。这里把整套的替代方案再搞一遍,可别再学过时技术了。❝

作者:码农小胖哥

原文链接:https://mp.weixin.qq.com/s/qK-gYDChxxtdFjnIo_ofqw

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

spring security框架用得多吗(用的挺顺手的SpringSecurity)(1)

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

spring security框架用得多吗(用的挺顺手的SpringSecurity)(2)

最后

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

spring security框架用得多吗(用的挺顺手的SpringSecurity)(3)


猜您喜欢: