Я пытаюсь получить пользователей AD, используя Spring LDAP. В домене 7 разных контроллеров домена, и каждый контроллер домена должен быть найден до того, как будет возвращен результат.
Сервер AD настроен так, чтобы возвращать максимум 1000 записей в одном запросе, и поэтому мне нужно разбить страницу на страницы. Результаты каждого запроса.
Это мой текущий рабочий код. Он не разбивает на страницы результаты и не генерирует PartialResultException
.
LdapContextSource ctx = new LdapContextSource();
ctx.setUrl("ldap://company.grp:389");
ctx.setBase("");
ctx.setUserDn("company\\ad-user");
ctx.setPassword("pw");
ctx.afterPropertiesSet();
LdapTemplate ldapTemplate = new LdapTemplate(ctx);
ldapTemplate.setIgnorePartialResultException(true);
try {
return ldapTemplate.search(
"dc=company,dc=grp",
"(&(objectClass=user)(objectCategory=person))",
SearchScope.SUBTREE.getId(),
"samaccountname,useraccountcontrol", //and many other fields
new LdapAttributeMapper() //custom mapper
);
} catch (Exception e) {
throw e;
}
. Чтобы реализовать пейджинг, я попробовал другой подход (который предоставляется здесь ), но он просто выбрасывает PartialResultException
и не возвращает никаких записей.
SearchControls sc = new SearchControls();
sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
sc.setReturningAttributes(Arrays.asList("samaccountname","useraccountcontrol")); //and many other fields
PagedResultsDirContextProcessor processor = new PagedResultsDirContextProcessor(500);
LdapContextSource ctx = new LdapContextSource();
ctx.setUrl("ldap://company.grp:389");
ctx.setBase("");
ctx.setUserDn("company\\ad-user");
ctx.setPassword("pw");
ctx.afterPropertiesSet();
return SingleContextSource.doWithSingleContext(ctx, new LdapOperationsCallback<List<CustomResponse>>() {
@Override
public List<CustomResponse> doWithLdapOperations(LdapOperations ops) {
List<CustomResponse> result = new ArrayList<>();
do {
List<CustomResponse> batchResult = ops.search(
"dc=company,dc=grp",
"(&(objectClass=user)(objectCategory=person))",
sc,
new LdapAttributeMapper(), //custom mapper
processor);
result.addAll(batchResult);
} while (processor.hasMore());
return result;
}
});
Здесь есть принятые ответы, которые предлагают установить атрибут Context.REFERRAL
в follow
, но это также не сработало, и я также не смог найти способ получить контроллеры домена текущего домена через библиотеку Spring LDAP.
Любая помощь приветствуется.