Spring LDAP嵌入式配置中LdapTemplate Base未正确设置问题咨询
你观察到的情况是正常的,但这属于Spring Boot自动配置设计里的一个小细节,并非不能同时使用spring.ldap.base和嵌入式LDAP配置,只是自动生成的LdapContextSource没有正确读取base属性而已。
问题根源
Spring Boot的EmbeddedLdapAutoConfiguration标注了@AutoConfigureBefore(LdapAutoConfiguration.class),这意味着它会优先执行。而它内部的EmbeddedLdapContextConfiguration类创建的LdapContextSource Bean,确实如你看到的代码一样,只设置了用户凭证和LDAP地址,完全没有处理spring.ldap.base配置项。
同时,LdapAutoConfiguration里的LdapContextSource Bean带有@ConditionalOnMissingBean注解——也就是说,只要已经存在一个LdapContextSource Bean(嵌入式配置创建的那个),它就不会再创建新的。这就导致你配置的spring.ldap.base根本没被用到。
解决方案
你有两种简单的方式来解决这个问题:
1. 自定义LdapContextSource并设置base
手动创建一个覆盖自动配置的LdapContextSource Bean,把spring.ldap.base的值加上:
@Configuration public class CustomLdapConfiguration { @Bean @DependsOn("directoryServer") // 确保依赖嵌入式LDAP服务先启动 public LdapContextSource ldapContextSource(Environment environment, LdapProperties properties, EmbeddedLdapProperties embeddedProperties) { LdapContextSource source = new LdapContextSource(); // 保留嵌入式配置的凭证设置 if (embeddedProperties.getCredential().isAvailable()) { source.setUserDn(embeddedProperties.getCredential().getUsername()); source.setPassword(embeddedProperties.getCredential().getPassword()); } source.setUrls(properties.determineUrls(environment)); // 手动添加base配置 source.setBase(properties.getBase()); return source; } }
2. 配置自定义LdapTemplate并设置base
如果不想修改LdapContextSource,也可以直接在LdapTemplate里指定base:
@Bean public LdapTemplate ldapTemplate(LdapContextSource ldapContextSource, LdapProperties properties) { LdapTemplate ldapTemplate = new LdapTemplate(ldapContextSource); // 给LdapTemplate设置默认base ldapTemplate.setBase(properties.getBase()); return ldapTemplate; }
之后你使用LdapTemplate进行操作时,就会自动使用你配置的base了。
总结
这不是你的配置问题,而是Spring Boot嵌入式LDAP自动配置的一个小疏漏——它没有把通用的spring.ldap.base属性整合到自动创建的LdapContextSource中。通过上面两种方式,就能轻松解决这个问题啦。
内容的提问来源于stack exchange,提问作者SaebaAtHot

