Spring LDAP querybuilder PartialResultException

时间:2017-03-27 08:22:30

标签: 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());
}

这是错误:

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)

当我按ou过滤时,它有效,但我需要从根过滤。

1 个答案:

答案 0 :(得分:5)

你写的问题是评论改变端口有帮助。 但改变端口并不能解决这个问题。 端口3268指向Active Directory特殊位置 - 全局编录。有一组所有对象 - 但每个对象只有很小的属性子集(例如 distinguishedName cn sAMAccountName ...) 。 所以 - 它可以工作,直到你不需要更多的特定属性。

问题分析

发生异常是因为AD作为查询的结果返回referral objects

  

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

如果禁用推荐追踪:

  

如果未启用引荐追踪并执行子树搜索,则搜索将返回指定域中符合搜索条件的所有对象。搜索还将返回到作为目录服务器域的直接后代的任何从属域的引用。客户必须通过绑定到引荐指定的路径和提交其他查询来解析引荐。

您可以启用引荐追踪,但这会花费成本 - 它会降低应用程序的速度 - 您可以阅读此here。而且我认为在大多数情况下都没有必要。

解决方案1:

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

this answer中阅读更多内容。

解决方案2:

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

ldapTemplate.setIgnorePartialResultException(true);

this answer中阅读更多内容。