版本
spring-security:6.2.1
滿足下列情況時(shí),spring-security會自動配置DaoAuthenticationProvider
- 使用@EnableWebSecurity
- 注冊UserDetailsServiceBean
- 沒有注冊其他AuthenticationProvider類型的Bean
- 沒有通過http.authenticationProvider配置
源碼
org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
// 導(dǎo)入全局認(rèn)證配置
@EnableGlobalAuthentication
public @interface EnableWebSecurity {}
org.springframework.security.config.annotation.authentication.configuration.EnableGlobalAuthentication
// 導(dǎo)入認(rèn)證配置
@Import(AuthenticationConfiguration.class)
public @interface EnableGlobalAuthentication {}
org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration
public class AuthenticationConfiguration {
...
@Bean
public static InitializeUserDetailsBeanManagerConfigurer initializeUserDetailsBeanManagerConfigurer(
ApplicationContext context) {
return new InitializeUserDetailsBeanManagerConfigurer(context);
}
...
}
org.springframework.security.config.annotation.authentication.configuration.InitializeUserDetailsBeanManagerConfigurer文章來源:http://www.zghlxwxcb.cn/news/detail-799480.html
@Order(InitializeUserDetailsBeanManagerConfigurer.DEFAULT_ORDER)
class InitializeUserDetailsBeanManagerConfigurer extends GlobalAuthenticationConfigurerAdapter {
...
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
auth.apply(new InitializeUserDetailsManagerConfigurer());
}
class InitializeUserDetailsManagerConfigurer extends GlobalAuthenticationConfigurerAdapter {
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
if (auth.isConfigured()) { // 如果認(rèn)證提供者不為空(通過httpSecurity配置了認(rèn)證提供者,或者注冊了AuthenticationProvider類型的Bean),或者上級的認(rèn)證管理器不為空則跳過
return;
}
UserDetailsService userDetailsService = getBeanOrNull(UserDetailsService.class);
if (userDetailsService == null) { // 如果沒有注冊 UserDetailsService Bean則跳過
return;
}
// 獲取密碼編碼器 Bean
PasswordEncoder passwordEncoder = getBeanOrNull(PasswordEncoder.class);
// 獲取 UserDetailsPasswordService Bean (用于密碼重新編碼)
UserDetailsPasswordService passwordManager = getBeanOrNull(UserDetailsPasswordService.class);
// 創(chuàng)建并注冊 DaoAuthenticationProvider
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setUserDetailsService(userDetailsService);
if (passwordEncoder != null) {
provider.setPasswordEncoder(passwordEncoder);
}
if (passwordManager != null) {
provider.setUserDetailsPasswordService(passwordManager);
}
provider.afterPropertiesSet();
auth.authenticationProvider(provider);
}
}
...
}
org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder文章來源地址http://www.zghlxwxcb.cn/news/detail-799480.html
public class AuthenticationManagerBuilder
extends AbstractConfiguredSecurityBuilder<AuthenticationManager, AuthenticationManagerBuilder>
implements ProviderManagerBuilder<AuthenticationManagerBuilder> {
...
public boolean isConfigured() {
return !this.authenticationProviders.isEmpty() || this.parentAuthenticationManager != null;
}
...
}
到了這里,關(guān)于spring security @EnableWebSecurity自動配置DaoAuthenticationProvider流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!