You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3配置LDAP(AD)认证后未识别自定义AuthenticationManager的问题

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 08:47:38