必须使用spring-boot-starter-data-ldap依赖,配置urls、base、username和password参数,通过ldapbindauthenticationmanagerfactory设置userdnpatterns,并配合ldapuserdetailsmapper完成用户属性与角色映射,实现企业级ldap统一认证。

要在Spring Boot 4.9中启用LDAP目录服务认证,完成企业级身份统一管理,必须使用官方支持的spring-boot-starter-data-ldap依赖,并严格匹配Spring Boot 4.9对应的Spring Security和Spring LDAP版本——低版本依赖会导致LdapAuthenticationProvider初始化失败或DN解析异常。
添加正确版本的LDAP Starter依赖
在pom.xml中声明依赖,【必须使用spring-boot-starter-data-ldap而非旧版spring-ldap-core】:
Spring Boot 4.9已将LDAP自动配置升级为基于ReactiveLdapContextSource的非阻塞模式,若手动引入spring-ldap-core会引发ClassCastException。
配置LDAP连接参数
在application.yml中填写基础连接信息:
spring:
ldap:
urls: ldap://localhost:389
base: dc=example,dc=com
username: cn=admin,dc=example,dc=com
password: admin123
注意:base属性值必须与LDAP服务器根节点完全一致,多一个空格或少一个逗号都会导致SearchDirContextProcessor初始化失败。
启用LDAP认证并绑定用户搜索规则
创建配置类WebSecurityConfig:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authz -> authz
.requestMatchers("/login", "/error").permitAll()
.anyRequest().authenticated())
.formLogin(form -> form
.loginPage("/login")
.permitAll());
return http.build();
}
@Bean
public AuthenticationManager authenticationManager(ApplicationContext context) {
LdapBindAuthenticationManagerFactory factory =
new LdapBindAuthenticationManagerFactory(context.getBean(LdapContextSource.class));
factory.setUserDnPatterns("uid={0},ou=people");
return factory.createAuthenticationManager();
}
}
这一步的关键是userDnPatterns必须与实际LDAP条目结构匹配。例如OpenLDAP默认用户存于ou=people,而Active Directory常用CN=Users;填错会导致BIND操作返回InvalidCredentialsException而不是UserNotFoundException。
验证LDAP用户属性映射(可选但推荐)
方法一:使用LdapUserDetailsMapper自动映射
@Bean
public LdapUserDetailsMapper userDetailsMapper() {
LdapUserDetailsMapper mapper = new LdapUserDetailsMapper();
mapper.setRolePrefix("ROLE_");
mapper.setConvertSubtreeRoles(true);
return mapper;
}
方法二:自定义UserDetailsContextMapper处理嵌套组成员关系
public class CustomUserDetailsContextMapper implements UserDetailsContextMapper {
@Override
public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection
String email = ctx.getStringAttribute("mail");
boolean enabled = "TRUE".equalsIgnoreCase(ctx.getStringAttribute("enabled"));
return User.withUsername(username)
.authorities(authorities)
.email(email)
.accountLocked(!enabled)
.build();
}
}
注意:Spring Boot 4.9中已废弃LdapAuthoritiesPopulator接口,改用LdapUserDetailsMapper或直接在AuthenticationManager中注入GroupSearchFilter。
启动应用并测试登录流程
第一步:确保OpenLDAP容器正在运行且端口389可达;
第二步:编译启动Spring Boot应用,访问http://localhost:8080/login;
第三步:输入LDAP中已存在的uid(如testuser)和对应密码;
第四步:成功跳转至默认首页,此时SecurityContextHolder.getContext().getAuthentication()中Principal类型为LdapUserDetails,Authorities包含从ou=groups检索到的全部groupOfNames成员角色。











