配置数据库自定义的UserDetalisService的身份认证时,发现
WebSecurityConfigurerAdapter
已废弃,在网上查阅了官方的案例文档,再加上自己项目的自定义数据库认证方案,将参考内容整理如下,有问题欢迎大家指正。
在 Spring Security 5.7.0-M2 中,弃用了
WebSecurityConfigurerAdapter
,Spring 鼓励用户转向基于组件的安全配置。
配置
HttpSecurity
在 Spring Security 5.4 中,Spring 引入了通过创建
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 中,Spring 还引入了
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。
全局认证管理器
要创建可供整个应用程序使用的
AuthenticationManager
,您只需将
AuthenticationManager
注册为
@Bean
。
@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();}}
本地身份验证管理器
在 Spring Security 5.6 中,Spring 引入了 HttpSecurity#authenticationManager 方法,它覆盖了特定
SecurityFilterChain
的默认
AuthenticationManager
。
下面是一个将自定义
AuthenticationManager
设置为默认值的示例配置:
@ConfigurationpublicclassSecurityConfiguration{@BeanpublicSecurityFilterChainfilterChain(HttpSecurity http)throwsException{
http
.authorizeHttpRequests((authz)-> authz
.anyRequest().authenticated()).httpBasic(withDefaults()).authenticationManager(newCustomAuthenticationManager());return http.build();}}
基于数据库自定义UserDetailsService
这是自己使用的基于数据库与JWT的认证方案。
以下是使用
WebSecurityConfigurerAdapter
的示例配置,该配置使用
HTTP Basic
保护所有站点:(不推荐使用)
@ConfigurationpublicclassWebSecurityConfigextendsWebSecurityConfigurerAdapter{@BeanpublicBCryptPasswordEncoderpasswordEncoder(){returnnewBCryptPasswordEncoder();}@Overrideprotectedvoidconfigure(AuthenticationManagerBuilder auth)throwsException{
auth.userDetailsService(userServiceImpl);}@Overridepublicvoidconfigure(HttpSecurity httpSecurity)throwsException{//Configuring HttpSecurity
···
}}
推荐的方法是注册一个
SecurityFilterChain
bean:
@ConfigurationpublicclassSecurityConfig{@BeanpublicBCryptPasswordEncoderpasswordEncoder(){returnnewBCryptPasswordEncoder();}@BeanAuthenticationManagerauthenticationManager(HttpSecurity httpSecurity)throwsException{AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManagerBuilder.class).userDetailsService(userServiceImpl).passwordEncoder(passwordEncoder()).and().build();return authenticationManager;}@BeanpublicSecurityFilterChainsecurityFilterChain(AuthenticationManager authenticationManager,HttpSecurity httpSecurity)throwsException{//Configuring HttpSecurity
···
}}
**
如果想了解基于数据库的自定义UserDetailsService的JWT方法,可以移步另一篇文章 基于数据库自定义UserDetailsService实现JWT认证
**
参考网页
- 基于数据库的SpringSecurity配置
- Spring Security without the WebSecurityConfigurerAdapter
版权归原作者 lazy_LYF 所有, 如有侵权,请联系我们删除。