Spring LDAP как l oop на контроллерах домена и реализовать нумерацию страниц - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь получить пользователей 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.

Любая помощь приветствуется.

...