升级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解析逻辑变更导致的:
- 2.0.x版本中,LdapTemplate执行查询前会自动对DN做标准化预处理,会自动过滤无意义的根路径
/,即使配置中误将base DN写为/,实际查询仍会从正确的目录搜索根节点发起检索,不会触发路径错误。 - 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
相关产品推荐
相关产品推荐

