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

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(失败)

CASE1 LDAP目录结构

CASE 2(成功)

CASE2 LDAP目录结构

问题与解答

问题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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:07:54