Spring Security 弃用WebSecurityConfigurerAdapter

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
    • 一、配置安全
    • 二、配置网络安全
    • 三、JDBC 身份验证
    • 四、内存中身份验证
    • 五、全局身份验证管理器
    • 六、本地身份验证管理器
    • 七、访问本地身份验证管理器
    • 总结
  • 更多信息查看官方文档


前言

使用Spring Security lambda DSL和方法来定义我们的授权规则。如果您是lambda DSL的新手,您可以在authorizeHttpRequests这篇博客文章.
如果您想了解更多关于我们为什么选择使用,您可以查看authorizeHttpRequests参考文档.

一、配置安全

在Spring Security5.4中是通过创建Bean进行配置的能力。HttpSecuritySecurityFilterChain
下面是使用 HTTP Basic 保护所有终结点的示例配置:WebSecurityConfigurerAdapter

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authz) -> authz
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
    }

}

但是在新版中官方建议方法是注册一个bean:SecurityFilterChain

@Configuration
public class SecurityConfiguration {

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

}

二、配置网络安全

在Spring Security5.4中的 WebSecurityCustomizer是一个回调接口,可用于自定义 WebSecurityCustomizerWebSecurity

下面是一个使用 的示例配置,该配置忽略匹配或的请求,列如:WebSecurityConfigurerAdapter/ignore1/ignore2这样的路径

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers("/ignore1", "/ignore2");
    }

}

但是在新版中官方建议方法是使用新的 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 身份验证

在Spring Security5.4中的是使用嵌入的 配置示例,该嵌入使用默认架构初始化并具有单个用户:WebSecurityConfigurerAdapterDataSource

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

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        auth.jdbcAuthentication()
            .withDefaultSchema()
            .dataSource(dataSource())
            .withUser(user);
    }
}

在新版中执行此操作的推荐方法是注册一个 Bean : JdbcUserDetailsManager

@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;
    }
}

注意:在这些示例中,我们使用该方法以提高可读性。它不适用于生产环境,相反,我们建议在外部散列密码。
执行此操作的一种方法是使用 Spring Boot CLI,如 User.withDefaultPasswordEncoder() 如果不清楚的小伙伴可以此参考文档

四、内存中身份验证

之前我们在配置具有单个用户的内存中用户存储的示例配置 :WebSecurityConfigurerAdapter
代码如下:

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        auth.inMemoryAuthentication()
            .withUser(user);
    }
}

在新本中执行此操作的推荐方法是注册 Bean:InMemoryUserDetailsManager

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

注意:在这些示例中,我们使用该方法以提高可读性。它不适用于生产环境,相反,我们建议在外部散列密码。执行此操作的一种方法是使用 Spring Boot CLI,如User.withDefaultPasswordEncoder()参考文档.

五、全局身份验证管理器

要创建可用于整个应用程序的 ,您只需将 注册为 AuthenticationManager AuthenticationManager @Bean
这种类型的配置如上所示LDAP 身份验证示例.

六、本地身份验证管理器

在春季安全5.6我们介绍方法authenticationManager将覆盖特定 .
下面是将自定义设置为默认值的示例配置:AuthenticationManager
SecurityFilterChain AuthenticationManager

@Configuration
public class SecurityConfiguration {

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

}

七、访问本地身份验证管理器

本地可以在AuthenticationManager自定义 DSL.这实际上是Spring Security内部实现的方法,例如.HttpSecurity.authorizeRequests()

public class MyCustomDsl extends AbstractHttpConfigurer<MyCustomDsl, HttpSecurity> {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class);
        http.addFilter(new CustomFilter(authenticationManager));
    }

    public static MyCustomDsl customDsl() {
        return new MyCustomDsl();
    }
}

然后,可以在构建时应用自定义 DSL:SecurityFilterChain

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    // ...
    http.apply(customDsl());
    return http.build();
}

总结

通过对Spring Security 新版本与旧版本的对比可以看到,大多数以往的接口现在都注册成Bean进行调用。

更多信息查看官方文档

地址:https://spring.io/projects/spring-security

你可能感兴趣的:(spring,java,servlet)