Spring Boot 3配置LDAP(AD)认证后未识别自定义AuthenticationManager的问题
我完全懂你现在的困扰——明明LDAP(AD)认证已经能正常工作了,但Spring Boot就是不识别你自定义的AuthenticationManager,还一个劲生成默认密码,这确实挺闹心的。
其实问题出在Spring Boot 3和Spring Security 6的配置方式变化上,之前基于AuthenticationManagerBuilder的注入配置,在新版本里优先级已经不如显式定义Bean的方式了,而且旧的WebSecurityConfigurerAdapter已经被废弃,咱们得换一套新的配置思路:
第一步:显式定义AuthenticationManager Bean
你需要把AuthenticationManager作为一个Bean交给Spring管理,而不是用@Autowired的configure方法来配置,这样Spring才能准确识别它:
@Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception { return authConfig.getAuthenticationManager(); }
第二步:用SecurityFilterChain整合LDAP配置
接下来,把你的LDAP认证逻辑迁移到SecurityFilterChain的配置里,替代原来的configure方法,这样整个安全配置会被Spring正确加载:
@Configuration @EnableWebSecurity public class SecurityConfig { private final String userSearchBase; private final String userSearchFilter; private final String url; private final String managerDn; private final String ldapPassword; // 通过构造器注入配置参数(推荐用@ConfigurationProperties加载,更规范) public SecurityConfig(@Value("${ldap.user-search-base}") String userSearchBase, @Value("${ldap.user-search-filter}") String userSearchFilter, @Value("${ldap.url}") String url, @Value("${ldap.manager-dn}") String managerDn, @Value("${ldap.manager-password}") String ldapPassword) { this.userSearchBase = userSearchBase; this.userSearchFilter = userSearchFilter; this.url = url; this.managerDn = managerDn; this.ldapPassword = ldapPassword; } @Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception { return authConfig.getAuthenticationManager(); } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, AuthenticationManager authManager) throws Exception { http .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ) .authenticationManager(authManager) .ldapAuthentication(ldap -> ldap .userSearchBase(userSearchBase) .userSearchFilter(userSearchFilter) .contextSource(contextSource -> contextSource .url(url) .managerDn(managerDn) .managerPassword(ldapPassword) ) ); return http.build(); } }
关键原因说明
Spring Security 6之后,官方不再推荐使用WebSecurityConfigurerAdapter,转而采用基于Bean的配置模式。原来的configure(AuthenticationManagerBuilder)方法属于旧模式的配置,Spring Boot在这种情况下可能还是会启用默认的安全配置,从而生成默认密码;而通过显式定义AuthenticationManager和SecurityFilterChain,Spring会优先加载你的自定义配置,自然就不会再生成默认密码了。
另外别忘了给你的配置类加上@Configuration和@EnableWebSecurity注解,确保Spring能扫描并加载这个配置。
备注:内容来源于stack exchange,提问作者aloopaneer

