WebSecurityConfigurerAdapter已弃用
配置数据库自定义的UserDetalisService的身份认证时,发现
WebSecurityConfigurerAdapter
已废弃,在网上查阅了官方的案例文档,再加上自己项目的自定义数据库认证方案,将参考内容整理如下,有问题欢迎大家指正。
在 Spring Security 5.7.0-M2 中,弃用了 WebSecurityConfigurerAdapter
,Spring 鼓励用户转向基于组件的安全配置。
配置 HttpSecurity
在 Spring Security 5.4 中,Spring 引入了通过创建 SecurityFilterChain
bean 来配置 HttpSecurity
的能力。
以下是使用 (不推荐使用)WebSecurityConfigurerAdapter
的示例配置,该配置使用 HTTP Basic
保护所有站点:
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
}
}
推荐的方法是注册一个 SecurityFilterChain
bean:
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
return http.build();
}
}
配置WebSecurity
在 Spring Security 5.4 中,Spring 还引入了 WebSecurityCustomizer
。WebSecurityCustomizer
是一个回调接口,可用于自定义 WebSecurity
。
下面是使用 (不推荐使用)WebSecurityConfigurerAdapter
的示例配置,它忽略匹配 /ignore1
或 /ignore2
的请求:
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/ignore1", "/ignore2");
}
}
推荐的方法是注册一个 WebSecurityCustomizer
bean:
@Configuration
public class SecurityConfiguration {
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring().antMatchers("/ignore1", "/ignore2");
}
}
警告:如果将 WebSecurity 配置为忽略请求,请考虑通过 HttpSecurity#authorizeHttpRequests 使用 permitAll。有关其他详细信息,请参阅
configure
Javadoc。
全局认证管理器
要创建可供整个应用程序使用的 AuthenticationManager
,您只需将 AuthenticationManager
注册为 @Bean
。
@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();
}
}
本地身份验证管理器
在 Spring Security 5.6 中,Spring 引入了 HttpSecurity#authenticationManager 方法,它覆盖了特定 SecurityFilterChain
的默认 AuthenticationManager
。
下面是一个将自定义 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();
}
}
基于数据库自定义UserDetailsService
这是自己使用的基于数据库与JWT的认证方案。
以下是使用 (不推荐使用)WebSecurityConfigurerAdapter
的示例配置,该配置使用 HTTP Basic
保护所有站点:
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
@Bean
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userServiceImpl);
}
@Override
public void configure(HttpSecurity httpSecurity) throws Exception {
//Configuring HttpSecurity
···
}
}
推荐的方法是注册一个 SecurityFilterChain
bean:
@Configuration
public class SecurityConfig{
@Bean
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Bean
AuthenticationManager authenticationManager(HttpSecurity httpSecurity) throws Exception {
AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManagerBuilder.class)
.userDetailsService(userServiceImpl)
.passwordEncoder(passwordEncoder())
.and()
.build();
return authenticationManager;
}
@Bean
public SecurityFilterChain securityFilterChain(AuthenticationManager authenticationManager, HttpSecurity httpSecurity) throws Exception {
//Configuring HttpSecurity
···
}
}
**
如果想了解基于数据库的自定义UserDetailsService的JWT方法,可以移步另一篇文章 基于数据库自定义UserDetailsService实现JWT认证
**
参考网页
1. 基于数据库的SpringSecurity配置
2. Spring Security without the WebSecurityConfigurerAdapter
更多推荐
所有评论(0)