我通过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");
更多信息:
我觉得奇怪的是剩下的名字是根目录......有人有任何想法如何解决这个问题,甚至在哪里开始寻找?
提前致谢!
答案 0 :(得分:7)
这可能与Active Directory无法自动处理引荐有关。请查看LdapTemplate javadoc。
如果是这种情况,请在ignorePartialResultException
配置中将true
属性设置为ldapTemplate
。
答案 1 :(得分:2)
在我的情况下出现此错误的原因是新AD的结构已更改(userPrincipleName现在是emailaddress而不是登录)。因此,对AD的身份验证工作正常,但是找不到与筛选器匹配的条目,因此没有返回任何结果。 所以PartialResultException只是一个指示,而不是原因。原因是SpringSecurityLdapTemplate类的方法searchForSingleEntryInternal中缺少任何结果。 在我的情况下,我必须确保使用正确的userPrincipleName并在我的ActiveDirectoryLdapAuthenticationProvider中配置正确的域和baseDN。