Spring Security 5.7.0弃用 WebSecurityConfigurerAdapter
文章目录
- Spring Security 弃用 WebSecurityConfigurerAdapter
- 官网博客说明
- 配置HttpSecurity
- 配置WebSecurity
- LDAP认证
- JDBC认证
- 内存内认证
- 全局认证管理器
- 局部认证管理器
- 访问局部认证管理器
- 欢迎加入
- 引用
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保护所有端点的示例配置:
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authz) -> authz.anyRequest().authenticated()).httpBasic(withDefaults());}
}
往后,我们建议注册一个SecurityFilterChain bean来做这件事:
@Configuration
public class SecurityConfiguration {@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authz) -> authz.anyRequest().authenticated()).httpBasic(withDefaults());return http.build();}
}
配置WebSecurity
在Spring Security 5.4中,我们还引入了WebSecurityCustomizer。
WebSecurityCustomizer是一个回调接口,可以用来定制WebSecurity。
下面是一个使用WebSecurityConfigurerAdapter忽略匹配/ignore1或/ignore2的请求的示例配置:
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overridepublic void configure(WebSecurity web) {web.ignoring().antMatchers("/ignore1", "/ignore2");}
}
往后,我们建议注册一个WebSecurityCustomizer bean来做这件事:
@Configuration
public class SecurityConfiguration {@Beanpublic WebSecurityCustomizer webSecurityCustomizer() {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认证:
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.ldapAuthentication().userDetailsContextMapper(new PersonContextMapper()).userDnPatterns("uid={0},ou=people").contextSource().port(0);}
}
往后,我们建议使用新的LDAP类来做这件事:
@Configuration
public class SecurityConfiguration {@Beanpublic EmbeddedLdapServerContextSourceFactoryBean contextSourceFactoryBean() {EmbeddedLdapServerContextSourceFactoryBean contextSourceFactoryBean =EmbeddedLdapServerContextSourceFactoryBean.fromEmbeddedLdapServer();contextSourceFactoryBean.setPort(0);return contextSourceFactoryBean;}@BeanAuthenticationManager ldapAuthenticationManager(BaseLdapPathContextSource contextSource) {LdapBindAuthenticationManagerFactory factory = new LdapBindAuthenticationManagerFactory(contextSource);factory.setUserDnPatterns("uid={0},ou=people");factory.setUserDetailsContextMapper(new PersonContextMapper());return factory.createAuthenticationManager();}
}
JDBC认证
下面是一个示例配置,它在WebSecurityConfigurerAdapter内创建了一个使用默认模式初始化并且只有一个用户的内嵌DataSource:
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Beanpublic DataSource dataSource() {return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {UserDetails user = User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build();auth.jdbcAuthentication().withDefaultSchema().dataSource(dataSource()).withUser(user);}
}
推荐的做法是创建一个JdbcUserDetailsManager bean来做这件事:
@Configuration
public class SecurityConfiguration {@Beanpublic DataSource dataSource() {return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).addScript(JdbcDaoImpl.DEFAULT_USER_SCHEMA_DDL_LOCATION).build();}@Beanpublic 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;}
}
注意:在这些例子中,我们为了可读性使用了User.withDefaultPasswordEncoder()。这不适合生产项目,我们建议在生产项目中使用散列密码。请按照参考文档所说的用Spring Boot命令行工具来做。
内存内认证
下面是一个示例配置,它在WebSecurityConfigurerAdapter配置了一个只存有一个用户的内存内用户:
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {UserDetails user = User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build();auth.inMemoryAuthentication().withUser(user);}
}
我们建议注册一个InMemoryUserDetailsManager bean来做这件事:
@Configuration
public class SecurityConfiguration {@Beanpublic InMemoryUserDetailsManager userDetailsService() {UserDetails user = User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build();return new InMemoryUserDetailsManager(user);}
}
注意:在这些例子中,我们为了可读性使用了User.withDefaultPasswordEncoder()。这不适合生产项目,我们建议在生产项目中使用散列密码。请按照参考文档所说的用Spring Boot命令行工具来做。
全局认证管理器
要创建一个整个应用都可以使用的AuthenticationManager,只需要使用@Bean将AuthenticationManager注册为bean就可以了。
这种配置已经在上面的LDAP认证示例展示过了。
局部认证管理器
在Spring Security 5.6中,我们引入了HttpSecurity#authenticationManager方法,这个方法可以为特定的SecurityFilterChain覆盖默认的AuthenticationManager。
下面是一个示例配置,它设置了一个自定义的AuthenticationManager:
@Configuration
public class SecurityConfiguration {@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authz) -> authz.anyRequest().authenticated()).httpBasic(withDefaults()).authenticationManager(new CustomAuthenticationManager());return http.build();}
}
访问局部认证管理器
可以使用自定义领域专用语言(DSL)访问局部AuthenticationManager。这实际上是Spring Security内部实现HttpSecurity.authorizeRequests()等方法的方式。
public class MyCustomDsl extends AbstractHttpConfigurer<MyCustomDsl, HttpSecurity> {@Overridepublic void configure(HttpSecurity http) throws Exception {AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class);http.addFilter(new CustomFilter(authenticationManager));}public static MyCustomDsl customDsl() {return new MyCustomDsl();}
}
然后,在构建SecurityFilterChain时可以应用自定义领域专用语言(DSL):
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {// ...http.apply(customDsl());return http.build();
}
欢迎加入
我们很高兴与您分享这些更新,我们期待通过您的反馈进一步增强 Spring 安全性!如果你有兴趣贡献,你可以在GitHub上找到我们。
引用
https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
