0


Spring Security 5.7.0弃用 WebSecurityConfigurerAdapter

文章目录

Spring Security 弃用 WebSecurityConfigurerAdapter

官网博客说明

官网博客链接地址:https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter

Spring Security 5.7.0-M2,我们弃用了

WebSecurityConfigurerAdapter

,因为我们鼓励用户转向使用基于组件的安全配置。

为了帮助大家熟悉这种新的配置风格,我们编制了一份常见用例表和推荐的新写法。

在下面的例子中,我们遵循最佳实践——使用 Spring Security lambda 领域专用语言(DSL)和

HttpSecurity#authorizeHttpRequests

方法来定义我们的授权规则。如果你对lambda领域专用语言(DSL)不熟悉,你可以在这篇博客了解它。如果你想知道为什么我们选择选择使用

HttpSecurity#authorizeHttpRequests

,你可以看这篇 参考文档。

配置HttpSecurity

在Spring Security 5.4,我们介绍了创建一个

SecurityFilterChain

bean来配置

HttpSecurity

的功能。

下面是一个使用

WebSecurityConfigurerAdapter

和HTTP Basic保护所有端点的示例配置:

@ConfigurationpublicclassSecurityConfigurationextendsWebSecurityConfigurerAdapter{@Overrideprotectedvoidconfigure(HttpSecurity http)throwsException{
        http
            .authorizeHttpRequests((authz)-> authz
                .anyRequest().authenticated()).httpBasic(withDefaults());}}

往后,我们建议注册一个

SecurityFilterChain

bean来做这件事:

@ConfigurationpublicclassSecurityConfiguration{@BeanpublicSecurityFilterChainfilterChain(HttpSecurity http)throwsException{
        http
            .authorizeHttpRequests((authz)-> authz
                .anyRequest().authenticated()).httpBasic(withDefaults());return http.build();}}

配置WebSecurity

在Spring Security 5.4中,我们还引入了

WebSecurityCustomizer

WebSecurityCustomizer

是一个回调接口,可以用来定制

WebSecurity

下面是一个使用

WebSecurityConfigurerAdapter

忽略匹配

/ignore1

/ignore2

的请求的示例配置:

@ConfigurationpublicclassSecurityConfigurationextendsWebSecurityConfigurerAdapter{@Overridepublicvoidconfigure(WebSecurity web){
        web.ignoring().antMatchers("/ignore1","/ignore2");}}

往后,我们建议注册一个

WebSecurityCustomizer

bean来做这件事:

@ConfigurationpublicclassSecurityConfiguration{@BeanpublicWebSecurityCustomizerwebSecurityCustomizer(){return(web)-> web.ignoring().antMatchers("/ignore1","/ignore2");}}

警告:如果你正在配置

WebSecurity

来忽略请求,建议你改为在

HttpSecurity#authorizeHttpRequests

内使用

permitAll

。想了解更多请参考

configure

Javadoc。

LDAP认证

在Spring Security 5.7,我们引入了

EmbeddedLdapServerContextSourceFactoryBean

LdapBindAuthenticationManagerFactory

LdapPasswordComparisonAuthenticationManagerFactory

,这些类都可以用来创建一个嵌入式的LDAP服务器;并且我们还引入一个

AuthenticationManager

类,它可以用来执行LDAP认证。

下面是一个使用是一个使用绑定验证的示例配置,它使用了

WebSecurityConfigurerAdapter

创建嵌入式LDAP服务器并且使用

AuthenticationManager

执行LDAP认证:

@ConfigurationpublicclassSecurityConfigurationextendsWebSecurityConfigurerAdapter{@Overrideprotectedvoidconfigure(AuthenticationManagerBuilder auth)throwsException{
        auth
            .ldapAuthentication().userDetailsContextMapper(newPersonContextMapper()).userDnPatterns("uid={0},ou=people").contextSource().port(0);}}

往后,我们建议使用新的LDAP类来做这件事:

@ConfigurationpublicclassSecurityConfiguration{@BeanpublicEmbeddedLdapServerContextSourceFactoryBeancontextSourceFactoryBean(){EmbeddedLdapServerContextSourceFactoryBean contextSourceFactoryBean =EmbeddedLdapServerContextSourceFactoryBean.fromEmbeddedLdapServer();
        contextSourceFactoryBean.setPort(0);return contextSourceFactoryBean;}@BeanAuthenticationManagerldapAuthenticationManager(BaseLdapPathContextSource contextSource){LdapBindAuthenticationManagerFactory factory =newLdapBindAuthenticationManagerFactory(contextSource);
        factory.setUserDnPatterns("uid={0},ou=people");
        factory.setUserDetailsContextMapper(newPersonContextMapper());return factory.createAuthenticationManager();}}

JDBC认证

下面是一个示例配置,它在

WebSecurityConfigurerAdapter

内创建了一个使用默认模式初始化并且只有一个用户的内嵌

DataSource

@ConfigurationpublicclassSecurityConfigurationextendsWebSecurityConfigurerAdapter{@BeanpublicDataSourcedataSource(){returnnewEmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();}@Overrideprotectedvoidconfigure(AuthenticationManagerBuilder auth)throwsException{UserDetails user =User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build();
        auth.jdbcAuthentication().withDefaultSchema().dataSource(dataSource()).withUser(user);}}

推荐的做法是创建一个

JdbcUserDetailsManager

bean来做这件事:

@ConfigurationpublicclassSecurityConfiguration{@BeanpublicDataSourcedataSource(){returnnewEmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).addScript(JdbcDaoImpl.DEFAULT_USER_SCHEMA_DDL_LOCATION).build();}@BeanpublicUserDetailsManagerusers(DataSource dataSource){UserDetails user =User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build();JdbcUserDetailsManager users =newJdbcUserDetailsManager(dataSource);
        users.createUser(user);return users;}}

注意:在这些例子中,我们为了可读性使用了

User.withDefaultPasswordEncoder()

。这不适合生产项目,我们建议在生产项目中使用散列密码。请按照参考文档所说的用Spring Boot命令行工具来做。

内存内认证

下面是一个示例配置,它在

WebSecurityConfigurerAdapter

配置了一个只存有一个用户的内存内用户:

@ConfigurationpublicclassSecurityConfigurationextendsWebSecurityConfigurerAdapter{@Overrideprotectedvoidconfigure(AuthenticationManagerBuilder auth)throwsException{UserDetails user =User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build();
        auth.inMemoryAuthentication().withUser(user);}}

我们建议注册一个

InMemoryUserDetailsManager

bean来做这件事:

@ConfigurationpublicclassSecurityConfiguration{@BeanpublicInMemoryUserDetailsManageruserDetailsService(){UserDetails user =User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build();returnnewInMemoryUserDetailsManager(user);}}

注意:在这些例子中,我们为了可读性使用了

User.withDefaultPasswordEncoder()

。这不适合生产项目,我们建议在生产项目中使用散列密码。请按照参考文档所说的用Spring Boot命令行工具来做。

全局认证管理器

要创建一个整个应用都可以使用的

AuthenticationManager

,只需要使用

@Bean

AuthenticationManager

注册为bean就可以了。

这种配置已经在上面的LDAP认证示例展示过了。

局部认证管理器

在Spring Security 5.6中,我们引入了

HttpSecurity#authenticationManager

方法,这个方法可以为特定的

SecurityFilterChain

覆盖默认的

AuthenticationManager

下面是一个示例配置,它设置了一个自定义的

AuthenticationManager

@ConfigurationpublicclassSecurityConfiguration{@BeanpublicSecurityFilterChainfilterChain(HttpSecurity http)throwsException{
        http
            .authorizeHttpRequests((authz)-> authz
                .anyRequest().authenticated()).httpBasic(withDefaults()).authenticationManager(newCustomAuthenticationManager());return http.build();}}

访问局部认证管理器

可以使用自定义领域专用语言(DSL)访问局部

AuthenticationManager

。这实际上是Spring Security内部实现

HttpSecurity.authorizeRequests()

等方法的方式。

publicclassMyCustomDslextendsAbstractHttpConfigurer<MyCustomDsl,HttpSecurity>{@Overridepublicvoidconfigure(HttpSecurity http)throwsException{AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class);
        http.addFilter(newCustomFilter(authenticationManager));}publicstaticMyCustomDslcustomDsl(){returnnewMyCustomDsl();}}

然后,在构建

SecurityFilterChain

时可以应用自定义领域专用语言(DSL):

@BeanpublicSecurityFilterChainfilterChain(HttpSecurity http)throwsException{// ...
    http.apply(customDsl());return http.build();}

欢迎加入

我们很高兴与您分享这些更新,我们期待通过您的反馈进一步增强 Spring 安全性!如果你有兴趣贡献,你可以在GitHub上找到我们。

引用

https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter

标签: spring java spring boot

本文转载自: https://blog.csdn.net/OLinOne/article/details/128100367
版权归原作者 OLinOne 所有, 如有侵权,请联系我们删除。

“Spring Security 5.7.0弃用 WebSecurityConfigurerAdapter”的评论:

还没有评论