Поиск Spring в LdapTemplate: PartialResultException: необработанные ссылки на продолжение; оставшееся имя '/'
Я добавляю пользователей через LDAP для определенного приложения, сделанного с весны.
Хотя это работает для большинства случаев, в некоторых случаях это не работает...
Получить пользователей, которых я использую:
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. ВЫПУСК
- Версия Spring ldap-core - 2.0.2.
Мне кажется странным, что оставшееся имя является корневым каталогом... У кого-нибудь есть идеи, как это исправить, или даже с чего начать искать?
Заранее спасибо!
2 ответа
Это может быть связано с тем, что Active Directory не может автоматически обрабатывать рефералы. Пожалуйста, ознакомьтесь с Javadoc LdapTemplate.
Если это так, установите ignorePartialResultException
собственность на true
в вашем ldapTemplate
конфигурации.
Причиной этой ошибки в моем случае было то, что структура новой AD изменилась (userPrincipleName теперь был адресом электронной почты вместо логина). Из-за этого аутентификация в AD работала нормально, но не было найдено ни одной записи, которая соответствовала бы фильтру, и, как таковая, не возвращала никакого результата. Таким образом, PartialResultException был только указанием, а не причиной. причина в отсутствии какого-либо результата в методе searchForSingleEntryInternal класса SpringSecurityLdapTemplate. В моем случае мне нужно было убедиться, что я использовал правильное userPrincipleName и настроить правильные домен и baseDN в моем ActiveDirectoryLdapAuthenticationProvider.