#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, и структура является устаревшей.