поиск ldap в java — поиск всех групп с конкретным пользователем в нем

#java #ldap #jndi

#java #ldap #jndi

Вопрос:

Учитывая приведенную ниже структуру ldap (более или менее)

 C=NO
-o=mydomain
--cn=groups
---cn=group1
----uid=bob,cn=users,o=mydomain,C=NO
---cn=group2
----uid=bob,cn=users,o=mydomain,C=NO
----uid=odd,cn=users,o=mydomain,C=NO
--cn=users
---uid=bob,cn=Robert,sn=Johnsen
---uid=odd,cn=Odd,sn=Olsen
  

Я использую следующий URL = ldap://server:port/o=mydomain, C = NO

Тогда я могу получить в основном все дерево с помощью поиска, примерно подобного этому:

 NamingEnumeration results = ctx.search("cn=groups", "cn=*", constraints);
  

где ограничения — это

 constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
  

Однако я хотел бы получать только группы с конкретным пользователем в нем. Я перепробовал множество вариантов, таких как

         NamingEnumeration results = ctx.search("cn=groups"
                , "(amp;(uid={0},cn=users,o=fund,C=NO)(cn=*))"
                        , new Object[] {"odd"}
                        , constraints);
  

но я получаю только пустые результаты. Кажется, все или ничего… Я подозреваю, что проблема в том, что cn =* и uid = odd находятся на разных уровнях дерева, например. uid= — это атрибут, но cn = * — это узел на один уровень выше?

Как бы я мог завершить этот поиск более эффективным способом, чем просто извлекать все и анализировать это на стороне клиента?

Ответ №1:

Ваша структура LDAP выглядит странно.

на что похож класс объектов cn=group1 ? это «Организационное подразделение» или «группа»?

В обычных каталогах пользователи создаются под объектами на основе класса «organizationalUnits», а для административных нужд они группируются по атрибуту, называемому «член» объектов класса «группа».

В этом случае фильтр LDAP будет выглядеть :

 (amp;(objectClass=group)(member=uid={0},cn=users,o=fund,C=NO))
  

В описываемой вами архитектуре вы можете обратить внимание на функцию под названием ExtensibleMatch, которая, кажется, правильно объяснена в этой вики-статье .

Комментарии:

1. Спасибо, это сработало, я сам откопал что-то похожее из сети. objectClass=accessGroup, и структура является устаревшей.