配置数据库自定义的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 还引入了 WebSecurityCustomizerWebSecurityCustomizer 是一个回调接口,可用于自定义 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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐