Spring LDAP querybuilder PartialResultException

Álv*_*lba 3 spring spring-ldap

我正在尝试从LDAP服务器中获取所有用户,并从基础上进行搜索,这是我的代码:

public LdapTemplate ldapTemplate() {
        LdapContextSource ctxSrc = new LdapContextSource();
        ctxSrc.setUrl("ldap://127.0.0.1:389/");
        ctxSrc.setBase("dc=test,dc=com");
        ctxSrc.setUserDn("admin");
        ctxSrc.setPassword("password");
        ctxSrc.afterPropertiesSet();
        LdapTemplate lt = new LdapTemplate(ctxSrc);
        return lt;
}
private LdapTemplate ldapTemplate = ldapTemplate();
public List<User> getAllUsers() {

        LdapQuery query= query().base("").where("objectclass").is("user");
        return ldapTemplate.search(query, new UserAttributesMapper());
}
Run Code Online (Sandbox Code Playgroud)

这是错误:

10:07:09.406 [main] DEBUG o.s.l.c.s.AbstractContextSource - AuthenticationSource not set - using default implementation
10:07:09.413 [main] DEBUG o.s.l.c.s.AbstractContextSource - Not using LDAP pooling
10:07:09.416 [main] DEBUG o.s.l.c.s.AbstractContextSource - Trying provider Urls: ldap://127.0.0.1:389/dc=test,dc=com
10:07:09.548 [main] DEBUG o.s.l.c.s.AbstractContextSource - Got Ldap context on server 'ldap://127.0.0.1:389/dc=test,dc=com'
Exception in thread "main" org.springframework.ldap.PartialResultException: Unprocessed Continuation Reference(s); nested exception is javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name '/'
    at org.springframework.ldap.support.LdapUtils.convertLdapException(LdapUtils.java:216)
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:385)
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:309)
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:616)
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:586)
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:1651)
    at ldap.example.UserRepositoryImpl.getAllUsers(UserRepositoryImpl.java:81)
    at ldap.example.test.LdapApp.main(LdapApp.java:23)
Caused by: javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name '/'
    at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2914)
    at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2888)
    at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.getNextBatch(AbstractLdapNamingEnumeration.java:148)
    at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.hasMoreImpl(AbstractLdapNamingEnumeration.java:217)
    at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.hasMore(AbstractLdapNamingEnumeration.java:189)
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:365)
    ... 6 more

BUILD FAILED (total time: 1 second)
Run Code Online (Sandbox Code Playgroud)

当我按ou它过滤时可以,但是我需要从根开始过滤。

jso*_*ski 5

您在有问题的评论中写道,更改端口会有所帮助。但是更改端口并不能解决此问题。端口3268指向Active Directory特殊位置-全局目录。所有对象都有一组-但每个对象只有一小部分属性(例如distinguishedNamecnsAMAccountName ...)。所以-它起作用直到您不需要更多特定的属性。

问题分析

发生异常是因为查询的结果是AD返回引用对象

[Active Directory](...)生成引用,以响应查询请求有关目录林中存在但不包含在处理请求的目录服务器中的对象的数据。这些称为内部交叉引用,因为它们引用目录林中的域,架构和配置容器。

如果禁用了引用跟踪:

如果未启用引用跟踪并且执行了子树搜索,则搜索将返回指定域内满足搜索条件的所有对象。该搜索还将返回对目录服务器域的直接后代的任何从属域的引用。客户端必须通过绑定到引用指定的路径并提交另一个查询来解析引用。

您可以启用引荐跟踪,但这样做会增加成本-降低应用程序的速度-您可以在此处阅读有关内容。而且我认为在大多数情况下没有必要。

解决方案1:

有时,足够的解决方案是ctxSrc.setBase()在您的问题中分配更具体的baseDN- 方法。也许所有用户都在内部路径之内,例如"ou=user,dc=department,dc=test,dc=com"

阅读更多此答案

解决方案2:

在Spring中,LdapTemplate您还可以使用setIgnorePartialResultException()方法忽略此异常:

ldapTemplate.setIgnorePartialResultException(true);
Run Code Online (Sandbox Code Playgroud)

阅读更多此答案