Spring Security即将弃用配置类WebSecurityConfigurerAdapter

举报
码农小胖哥 发表于 2022/03/31 23:25:32 2022/03/31
【摘要】 2022年的开工福利已经发布,点击下面按钮获取最新PDF。 用过WebSecurityConfigurerAdapter的都知道对Spring Security十分重要,总管Spring Security的配置体系。但是马上这个类要废了,你没有看错,这个类将在5.7版本被@Deprecated所标记了,未来这个类将被移除...

efd4900a2b6c89834f20b3b68fc4a71d.gif

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

80585607d1710d649d0853071f9f57df.png

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

433e27629a9f5344be655bc7ba3ba601.png 相关的issues已经被处理并关闭

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

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

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

HttpSecurity新旧玩法对比

旧玩法:


   
  1. @Configuration
  2. static class SecurityConfig extends WebSecurityConfigurerAdapter {
  3.     @Override
  4.     protected void configure(HttpSecurity http) throws Exception {
  5.         http
  6.             .antMatcher("/**")
  7.             .authorizeRequests(authorize -> authorize
  8.                     .anyRequest().authenticated()
  9.             );
  10.     }
  11. }

新玩法:


   
  1. @Bean
  2. SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  3.     return http
  4.             .antMatcher("/**")
  5.             .authorizeRequests(authorize -> authorize
  6.                     .anyRequest().authenticated()
  7.             )
  8.             .build();
  9. }

相关原理去看这一篇文章

WebSecurity新旧玩法对比

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

旧玩法:


   
  1. @Configuration
  2. public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
  3.     @Override
  4.     public void configure(WebSecurity web) {
  5.         // 仅仅作为演示
  6.         web.ignoring().antMatchers("/ignore1""/ignore2");
  7.     }
  8. }

新玩法:


   
  1. @Configuration
  2. public class SecurityConfiguration {
  3.     @Bean
  4.     public WebSecurityCustomizer webSecurityCustomizer() {
  5.         // 仅仅作为演示
  6.         return (web) -> web.ignoring().antMatchers("/ignore1""/ignore2");
  7.     }
  8. }

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

AuthenticationManager新旧玩法对比

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

旧玩法


   
  1. @Configuration
  2. public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
  3.     @Override
  4.     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  5.         auth.jdbcAuthentication();
  6.     }
  7. }

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


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

新玩法

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


   
  1. @Configuration
  2. public class SecurityConfiguration {
  3.     @Bean
  4.     public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  5.         http
  6.             .authorizeHttpRequests((authz) -> authz
  7.                 .anyRequest().authenticated()
  8.             )
  9.             .httpBasic(withDefaults())
  10.             .authenticationManager(new CustomAuthenticationManager());
  11.     }
  12. }

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


   
  1. @Bean
  2.     AuthenticationManager ldapAuthenticationManager(
  3.             BaseLdapPathContextSource contextSource) {
  4.         LdapBindAuthenticationManagerFactory factory = 
  5.             new LdapBindAuthenticationManagerFactory(contextSource);
  6.         factory.setUserDnPatterns("uid={0},ou=people");
  7.         factory.setUserDetailsContextMapper(new PersonContextMapper());
  8.         return factory.createAuthenticationManager();
  9.     }

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

dc5ae58e377e91a781efaba54ee30634.png

最后

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

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

2022-02-21

7ce1286418f16b078dcba8ffd5247e01.png

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

2022-02-16

23ef0566f886f5bbc3a2dc1442a8df7e.png

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

2022-02-15

0156e6052fd0e8b006b6e7fc5e12f0e8.png

f4815fa40ba165ad8f32a0151bd0e39e.gif

7b3ac252dbba46549694cdab0e16652d.png

文章来源: felord.blog.csdn.net,作者:码农小胖哥,版权归原作者所有,如需转载,请联系作者。

原文链接:felord.blog.csdn.net/article/details/123081005

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。