• Spring Security即将弃用WebSecurityConfigurerAdapter配置类


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

    最后

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

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

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

  • 相关阅读:
    后台管理界面
    登陆页面
    Django models中关于blank与null的补充说明
    django学习之路
    Django在根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'
    django2笔记:路由path语法
    四 数据库备份
    Python操作MySQL
    三 数据库其他
    Shell----简单整理
  • 原文地址:https://www.cnblogs.com/felordcn/p/15922976.html
Copyright © 2020-2023  润新知