Spring LDAP поиск с организационными единицами возвращает ноль результатов

Я работаю над простым программным обеспечением командной строки Java, которое выполняет рекурсивный поиск LDAP с помощью Spring LDAP, начиная с указанной группы и выполняя поиск всех пользователей из указанных групп и подгрупп.

Поиск не может найти ничего, если отличительное имя группы содержит организационные единицы (=ou), но работает в других случаях.

Вот краткая версия реализации, рекурсия опущена:

private void searchLdapGroup(List<UserDTO> users, LdapTemplate ldapTemplate, String groupName) {
    // recursion guard omitted
    String base = groupName.substring(groupName.indexOf(',') + 1);
    AndFilter filter = new AndFilter().and(new EqualsFilter("objectclass", "group")).and(new EqualsFilter("memberof", groupName));
    List<String> subgroups = ldapTemplate.search(base, filter.encode(), new GroupNameMapper());

    // recursive calls for subgroups omitted
    getAllUsers(users, ldapTemplate, groupName, base);
}

private void getAllUsers(List<UserDTO> users, LdapTemplate ldapTemplate, String groupName, String base) {
    AndFilter filter = new AndFilter().and(new EqualsFilter("objectclass", "person")).and(new EqualsFilter("memberof", groupName));
    // Paged search omitted.
    List<UserDTO> result = ldapTemplate.search(base,filter.encode(),new UserAttributesMapper());
    users.addAll(result);       
}

GroupNameMapper возвращает отличительное имя как строки и UserAttributesMapper возвращает объекты пользователя из разных атрибутов, таких как sAMAccountName а также givenName,

Код (с рекурсией) находит всех 36 пользователей в первой тестовой группе, где указанная группа похожа на:

CN= import_users,CN= Users, DC = пример, DC = тест, DC = орг

в той же самой тестовой среде он возвращает ноль человек и подгрупп, когда отличительное имя группы содержит одну или несколько организационных единиц, таких как

CN= import_users,OU = testou, DC = пример, DC = тест, DC = орг

Это не может быть связано с неправильным отличительным именем группы, "memberof" не работает или группой, не содержащей пользователей, так как я проверил поиск:

String[] test = (String[])ldapTemplate.lookup("CN=import_users,OU=testou,DC=example,DC=test,DC=org", new ContextMapper() {
        public Object mapFromContext(Object ctx) {
            DirContextAdapter adapter = (DirContextAdapter) ctx;
            return adapter.getStringAttributes("Member");
        }
 });

который находит

CN= Джон Доу,CN= Пользователи, DC = пример, DC = тест, DC = org

и поиск для пользователя John Doe

String[] test = (String[])ldapTemplate.lookup("CN=John Doe,CN=Users,DC=example,DC=test,DC=org", new ContextMapper() {
        public Object mapFromContext(Object ctx) {
            DirContextAdapter adapter = (DirContextAdapter) ctx;
            return adapter.getStringAttributes("memberof");
        }
    });

дает результаты:

CN=import_users,OU=testou,DC= пример, DC = тест,DC=org CN=import_users,CN= Пользователи, DC = пример, DC = тест, DC = org

Как получается, что поиск ничего не находит, когда задействованы организационные единицы?

Пользователь библиотеки: spring-ldap-core - 2.0.4.RELEASE

1 ответ

Решение

Дьявол кроется в деталях: участник группы CN=import_users,OU=testou,DC=example,DC=test,DC=org является

CN= Джон Доу,CN= Пользователи, DC = пример, DC = тест, DC = org

Но вы, похоже, ищете пользователей под

OU= TestOU, DC = пример, DC = тест, DC = орг

То есть кажется, что все пользователи находятся под CN=Users,DC=example,DC=test,DC=org, но когда вы на самом деле ищете пользователей, вы предполагаете, что они расположены относительно группы.

Другие вопросы по тегам