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

升级spring-ldap后findUser报LDAP错误码32 No Such Object异常

问题描述
  • 项目升级spring-ldap版本:从生产环境使用的2.0.2.RELEASE升级至2.4.0,升级过程仅更新了依赖对应的.xsd schema文件,未修改任何业务代码与配置项,升级后查询已存在的LDAP用户时触发异常。
  • 版本复现测试结果:降级到2.1.0.RELEASE版本时异常仍存在,回退至2.0.2.RELEASE版本后异常完全消失。
  • 异常触发代码行:
ldapTemplate.findOne(query().where("uid").is(uid), LdapUser.class)
异常详情

抛出的异常栈核心信息如下:

org.springframework.ldap.NameNotFoundException: [LDAP: error code 32 - No Such Object]
nested exception is javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]
remaining name: '/'
根因分析

该问题是spring-ldap 2.1.0版本开始的DN解析逻辑变更导致的:

  1. 2.0.x版本中,LdapTemplate执行查询前会自动对DN做标准化预处理,会自动过滤无意义的根路径/,即使配置中误将base DN写为/,实际查询仍会从正确的目录搜索根节点发起检索,不会触发路径错误。
  2. 2.1.0及以上版本重构了DN解析模块,移除了上述自动过滤根斜杠的预处理逻辑。如果项目中LdapContextSource的base属性被配置为/、或者未正确配置实际的LDAP根路径导致默认解析为/,执行findOne查询时会直接将根路径/作为查询起点提交给LDAP服务端,服务端根节点下不存在匹配对应uid的用户条目,直接返回错误码32(No Such Object)。
修复方案

按优先级选择以下方案处理即可:

  • 优先修正配置:检查spring-ldap.xml中LdapContextSource的base属性配置,不要填写/,替换为实际的LDAP根目录DN,例如dc=company,dc=com,配置参考:
<bean id="ldapContextSource" class="org.springframework.ldap.core.support.LdapContextSource">
    <property name="url" value="${ldap.url}"/>
    <!-- 替换为实际的base DN,禁止配置为/ -->
    <property name="base" value="${ldap.base:dc=company,dc=com}"/>
    <property name="userDn" value="${ldap.userDn}"/>
    <property name="password" value="${ldap.password}"/>
</bean>
  • 检查实体类配置:查看LdapUser类上的@Entry注解,不要将注解的base属性设置为/,如果之前依赖旧版本的自动归一化逻辑配置了/,改为实际的用户OU路径(例如ou=users),或者留空继承全局contextSource的base配置。
  • 兼容特殊场景:如果业务必须保留旧的/配置写法,可以自定义DN处理器,在查询执行前手动剔除无意义的根斜杠,不过该方案不推荐,优先按官方规范修正配置即可。

内容的提问来源于stack exchange,提问作者Alison Graham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:57:25