Spring 的 LdapTemplate 搜索:PartialResultException:未处理的延续参考;剩余名称'/'

Spring's LdapTemplate search: PartialResultException: Unprocessed Continuation Reference(s); remaining name '/'

我通过 LDAP 为某个应用程序添加用户,使用 spring。

虽然这适用于大多数情况,但在某些情况下,它不起作用...

检索我使用的用户:

public class LdapUserServiceImpl implements ILdapUserService {

    @Override
    public List<LdapUserVO> getUserNamesByQuery(String query) {
        return ldapTemplate.search(
            query().countLimit(15)
                    .where("objectClass").is("user")
                    .and("sAMAccountName").isPresent()
                    .and(query()
                            .where("sAMAccountName").like("*" + query + "*")
                            .or("sAMAccountName").is(query)
                            .or("displayName").like("*" + query + "*")
                            .or("displayName").is(query))
            ,
            new AttributesMapper<LdapUserVO>() {
                public LdapUserVO mapFromAttributes(Attributes attrs) throws NamingException {
                    LdapUserVO ldapUser = new LdapUserVO();
                    Attribute attr = attrs.get(ldapUserSearch);
                    if (attr != null && attr.get() != null) {
                        ldapUser.setUserName(attr.get().toString());
                    }
                    attr = attrs.get("displayName");
                    if (attr != null && attr.get() != null) {
                        ldapUser.setDisplayName(attr.get().toString());
                    }
                    return ldapUser;
                }
            });
    }
}

所以这在大多数情况下都有效,但有时我会收到以下错误:

unprocessed continuation reference(s); remaining name "/"

我已经搜索了很多关于这个的东西,我明确地设置了

DefaultSpringSecurityContextSource ctxSrc = new DefaultSpringSecurityContextSource(ldapUrl);
ctxSrc.setReferral("follow");

更多信息:

我觉得奇怪的是剩下的名字是根目录...有人知道如何解决这个问题,或者从哪里开始寻找吗?

提前致谢!

这可能与 Active Directory 无法自动处理引用有关。请看一下 LdapTemplate javadoc.

如果是这种情况,请在您的 ldapTemplate 配置中将 ignorePartialResultException 属性 设置为 true

在我的案例中出现此错误的原因是新 AD 的结构已更改(userPrincipleName 现在是电子邮件地址而不是登录名)。因此,对 AD 的身份验证工作正常,但找不到与过滤器匹配的条目,因此没有 return 任何结果。 所以 PartialResultException 只是一个指示,而不是原因。原因是 SpringSecurityLdapTemplate class 的方法 searchForSingleEntryInternal 中缺少任何结果。 就我而言,我必须确保我使用了正确的 userPrincipleName 并在我的 ActiveDirectoryLdapAuthenticationProvider 中配置了正确的域和 baseDN。