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");
更多信息:
- 搜索查询 "admin_a" 有效,但 "admin_ah" 无效
- Spring 版本是 4.2.5.RELEASE
- Spring ldap-core 版本为 2.0.2.RELEASE
我觉得奇怪的是剩下的名字是根目录...有人知道如何解决这个问题,或者从哪里开始寻找吗?
提前致谢!
这可能与 Active Directory 无法自动处理引用有关。请看一下 LdapTemplate javadoc.
如果是这种情况,请在您的 ldapTemplate
配置中将 ignorePartialResultException
属性 设置为 true
。
在我的案例中出现此错误的原因是新 AD 的结构已更改(userPrincipleName 现在是电子邮件地址而不是登录名)。因此,对 AD 的身份验证工作正常,但找不到与过滤器匹配的条目,因此没有 return 任何结果。
所以 PartialResultException 只是一个指示,而不是原因。原因是 SpringSecurityLdapTemplate class 的方法 searchForSingleEntryInternal 中缺少任何结果。
就我而言,我必须确保我使用了正确的 userPrincipleName 并在我的 ActiveDirectoryLdapAuthenticationProvider 中配置了正确的域和 baseDN。
我通过 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");
更多信息:
- 搜索查询 "admin_a" 有效,但 "admin_ah" 无效
- Spring 版本是 4.2.5.RELEASE
- Spring ldap-core 版本为 2.0.2.RELEASE
我觉得奇怪的是剩下的名字是根目录...有人知道如何解决这个问题,或者从哪里开始寻找吗?
提前致谢!
这可能与 Active Directory 无法自动处理引用有关。请看一下 LdapTemplate javadoc.
如果是这种情况,请在您的 ldapTemplate
配置中将 ignorePartialResultException
属性 设置为 true
。
在我的案例中出现此错误的原因是新 AD 的结构已更改(userPrincipleName 现在是电子邮件地址而不是登录名)。因此,对 AD 的身份验证工作正常,但找不到与过滤器匹配的条目,因此没有 return 任何结果。 所以 PartialResultException 只是一个指示,而不是原因。原因是 SpringSecurityLdapTemplate class 的方法 searchForSingleEntryInternal 中缺少任何结果。 就我而言,我必须确保我使用了正确的 userPrincipleName 并在我的 ActiveDirectoryLdapAuthenticationProvider 中配置了正确的域和 baseDN。