SpringBoot LDAP认证异常:不同Base DN下用户认证失败排查
Spring Security LDAP认证问题排查
认证代码片段
protected void configure(AuthenticationManagerBuilder auth) throws Exception { if (ldapEnabled) { auth.ldapAuthentication() .userDetailsContextMapper(customContextMapper()) .userSearchFilter("(&(objectClass=user)(" + userDn+ "))") .contextSource() .url(ldapProviderUrl + baseDn.trim().replaceAll(" ", "%20")) .managerDn(ldap.username) .managerPassword(ldap.password); } else { super.configure(auth); } }
配置属性对比
CASE 1(认证失败)
ldap.enabled=true ldap.provider.url=ldap://XX.XX.XX.XX:389/ ldap.username=CN=XXXXXX,OU=**People**,DC=pserv,DC=local ldap.password=######### ldap.base.dn=OU=**User Accounts**,DC=pserv,DC=local ldap.user.dn.patterns=sAMAccountName={0} ldap.user.password.attribute=userPassword ldap.search.base.group=ou=groups
CASE 2(认证成功)
ldap.enabled=true ldap.provider.url=ldap://XX.XX.XX.XX:389/ ldap.username=CN=XXXXXX,OU=**People**,DC=pserv,DC=local ldap.password=######### ldap.base.dn=OU=**People**,DC=pserv,DC=local ldap.user.dn.patterns=sAMAccountName={0} ldap.user.password.attribute=userPassword ldap.search.base.group=ou=groups
LDAP目录结构
CASE 1(失败)

CASE 2(成功)

问题与解答
问题1:是否因为我的ldap.username所属OU为People导致认证失败?
不是。作为LDAP连接账号的manager DN,其所在OU与base DN没有强制关联限制,只要该账号拥有访问指定base DN下条目的权限即可。CASE2中base DN设为OU=People能成功认证,说明该manager账号确实有权限访问这个OU;CASE1失败的原因和manager账号所在OU无关,是base DN配置或服务器端存在问题。
问题2:已将CASE1中Base DN的空格替换为%20,但仍无法认证用户,报错翻译如下:
org.springframework.security.authentication.InternalAuthenticationServiceException: [LDAP: 错误代码32 - 0000208D: NameErr: DSID-03100245, 问题2001 (NO_OBJECT), data 0, 最佳匹配:
'DC=pserv,DC=local'
]; 嵌套异常是javax.naming.NameNotFoundException: [LDAP: 错误代码32 - 0000208D: NameErr: DSID-03100245, 问题2001 (NO_OBJECT), data 0, 最佳匹配:
'DC=pserv,DC=local'
]; 剩余名称 '/'
错误原因及解决办法:
- Base DN不存在或拼写错误:LDAP错误代码32表示找不到指定对象,说明服务器中不存在
OU=User Accounts,DC=pserv,DC=local这个条目。对照CASE1的目录结构截图,确认该OU是否真实存在,检查是否有拼写错误(比如空格、大小写偏差,LDAP对DN大小写不敏感,但OU名称需完全匹配)。 - URL编码操作多余:LDAP URL中的DN部分不需要进行URL编码,直接使用原始带空格的DN即可。代码中将空格替换为
%20会导致DN解析异常,应去掉这个替换逻辑,直接拼接原始base DN。 - manager账号权限不足:即使
OU=User Accounts存在,当前manager账号可能没有访问该OU下用户条目的权限。需在LDAP服务器端检查权限配置,确保该账号拥有对OU=User Accounts的读权限。
内容的提问来源于stack exchange,提问作者cNgamba
相关产品推荐
相关产品推荐

