文章目录 Spring Security 弃用 WebSecurityConfigurerAdapter官网博客说明配置HttpSecurity配置WebSecurityLDAP认证JDBC认证内存内认证全局认证管理器局部认证管理器
官网博客链接地址: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
,你可以看这篇 参考文档。
在Spring Security 5.4,我们介绍了创建一个SecurityFilterChain
bean来配置HttpSecurity
的功能。
下面是一个使用WebSecurityConfigurerAdapter
和HTTP Basic保护所有端点的示例配置:
@Configurationpublic class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeHttpRequests((authz) -> authz .anyRequest().authenticated() ) .httpBasic(withDefaults()); }}
往后,我们建议注册一个SecurityFilterChain
bean来做这件事:
@Configurationpublic class SecurityConfiguration { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests((authz) -> authz .anyRequest().authenticated() ) .httpBasic(withDefaults()); return http.build(); }}
在Spring Security 5.4中,我们还引入了WebSecurityCustomizer
。
WebSecurityCustomizer
是一个回调接口,可以用来定制WebSecurity
。
下面是一个使用WebSecurityConfigurerAdapter
忽略匹配/ignore1
或/ignore2
的请求的示例配置:
@Configurationpublic class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) { web.ignoring().antMatchers("/ignore1", "/ignore2"); }}
往后,我们建议注册一个WebSecurityCustomizer
bean来做这件事:
@Configurationpublic class SecurityConfiguration { @Bean public WebSecurityCustomizer webSecurityCustomizer() { return (web) -> web.ignoring().antMatchers("/ignore1", "/ignore2"); }}
警告:如果你正在配置WebSecurity
来忽略请求,建议你改为在HttpSecurity#authorizeHttpRequests
内使用permitAll
。想了解更多请参考configure
Javadoc。
在Spring Security 5.7,我们引入了EmbeddedLdapServerContextSourceFactoryBean
、LdapBindAuthenticationManagerFactory
和LdapPassWordComparisonAuthenticationManagerFactory
,这些类都可以用来创建一个嵌入式的LDAP服务器;并且我们还引入一个AuthenticationManager
类,它可以用来执行LDAP认证。
下面是一个使用是一个使用绑定验证的示例配置,它使用了WebSecurityConfigurerAdapter
创建嵌入式LDAP服务器并且使用AuthenticationManager
执行LDAP认证:
@Configurationpublic class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .ldapAuthentication() .userDetailsContextMapper(new PersonContextMapper()) .userDnPatterns("uid={0},ou=people") .contextSource() .port(0); }}
往后,我们建议使用新的LDAP类来做这件事:
@Configurationpublic 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(); }}
下面是一个示例配置,它在WebSecurityConfigurerAdapter
内创建了一个使用默认模式初始化并且只有一个用户的内嵌DataSource
:
@Configurationpublic 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); }}
推荐的做法是创建一个JdbcUserDetailsManager
bean来做这件事:
@Configurationpublic 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; }}
注意:在这些例子中,我们为了可读性使用了User.withDefaultPasswordEncoder()
。这不适合生产项目,我们建议在生产项目中使用散列密码。请按照参考文档所说的用Spring Boot命令行工具来做。
下面是一个示例配置,它在WebSecurityConfigurerAdapter
配置了一个只存有一个用户的内存内用户:
@Configurationpublic 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); }}
我们建议注册一个InMemoryUserDetailsManager
bean来做这件事:
@Configurationpublic class SecurityConfiguration { @Bean public 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
:
@Configurationpublic class SecurityConfiguration { @Bean public 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> { @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(); }}
然后,在构建SecurityFilterChain
时可以应用自定义领域专用语言(DSL):
@Beanpublic 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
来源地址:https://blog.csdn.net/OLinOne/article/details/128100367
--结束END--
本文标题: Spring Security 5.7.0弃用 WebSecurityConfigurerAdapter
本文链接: https://www.lsjlt.com/news/376175.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-04-03
2024-04-03
2024-04-01
2024-01-21
2024-01-21
2024-01-21
2024-01-21
2023-12-23
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0