优米格
分享有营养的

WebSecurityConfigurerAdapter已过时:Spring Security基于组件的安全配置实现

BraUndress.png

在Spring Security 5.7.0-M2版本,官方把WebSecurityConfigurerAdapter这个抽象类过时了。并鼓励大家使用基于组件的安全配置实现。

为了帮助用户过渡到这种新的配置方式,官方编制了一份常见用例列表和建议的替代方案:官方博客

一、WebSecurityConfigurerAdapter作用

在使用新的实现前,先理解一下原来WebSecurityConfigurerAdapter作用。WebSecurityConfigurerAdapter是一个抽象类,它实现了默认的认证和授权。允许用户自定义一个WebSecurity类,重写其中的三个configure来实现自定义的认证和授权,这三个configure分别是:

    /**
     * 自定义身份认证的逻辑
     *
     * @param auth
     * @throws Exception
     */
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    }

    /**
     * 自定义全局安全过滤的逻辑
     *
     * @param web
     * @throws Exception
     */
    public void configure(WebSecurity web) throws Exception {
    }

    /**
     * 自定义URL访问权限的逻辑
     *
     * @param http
     * @throws Exception
     */
    protected void configure(HttpSecurity http) throws Exception {
    }

二、基于组件的安全配置实现

2.1 HttpSecurity

在Spring Security 5.4及以后的版本,可以通过创建一个SecurityFilterChain Bean来配置HttpSecurity:

@Configuration
public class SecurityConfiguration {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authz) -> authz
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
        return http.build();
    }

}

2.2 WebSecurity

可以通过创建一个WebSecurityCustomizer Bean来配置WebSecurity(WebSecurityCustomizer 是一个回调接口,可用于自定义WebSecurity):

@Configuration
public class SecurityConfiguration {

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring().antMatchers("/ignore1", "/ignore2");
    }

}

2.3 AuthenticationManagerBuilder

在认证管理器AuthenticationManagerBuilder的配置方式,针对不同的实现,有不同的配置。

LDAP身份认证

@Configuration
public class SecurityConfiguration {
    @Bean
    public EmbeddedLdapServerContextSourceFactoryBean contextSourceFactoryBean() {
        EmbeddedLdapServerContextSourceFactoryBean contextSourceFactoryBean =
            EmbeddedLdapServerContextSourceFactoryBean.fromEmbeddedLdapServer();
        contextSourceFactoryBean.setPort(0);
        return contextSourceFactoryBean;
    }

    @Bean
    AuthenticationManager ldapAuthenticationManager(
            BaseLdapPathContextSource contextSource) {
        LdapBindAuthenticationManagerFactory factory = 
            new LdapBindAuthenticationManagerFactory(contextSource);
        factory.setUserDnPatterns("uid={0},ou=people");
        factory.setUserDetailsContextMapper(new PersonContextMapper());
        return factory.createAuthenticationManager();
    }
}

JDBC身份认证

@Configuration
public class SecurityConfiguration {
    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .addScript(JdbcDaoImpl.DEFAULT_USER_SCHEMA_DDL_LOCATION)
            .build();
    }

    @Bean
    public UserDetailsManager users(DataSource dataSource) {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        JdbcUserDetailsManager users = new JdbcUserDetailsManager(dataSource);
        users.createUser(user);
        return users;
    }
}

内存认证

@Configuration
public class SecurityConfiguration {
    @Bean
    public InMemoryUserDetailsManager userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

参考:

  1. SpringBoot – WebSecurityConfigurerAdapter的作用是什么?
  2. Spring Security without the WebSecurityConfigurerAdapter
  3. SpringSecurity – WebSecurityConfigurerAdapter 过时问题
赞(1)
未经允许禁止转载:优米格 » WebSecurityConfigurerAdapter已过时:Spring Security基于组件的安全配置实现

评论 抢沙发

合作&反馈&投稿

商务合作、问题反馈、投稿,欢迎联系

广告合作侵权联系