Учитывая нижеприведенную структуру 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: // сервер: порт / o = mydomain, C = NO
Затем я могу получить практически все дерево с помощью поиска, подобного следующему:
NamingEnumeration results = ctx.search("cn=groups", "cn=*", constraints);
, где ограничения
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
Однако я хотел бы получить только группы с определенным пользователем в нем. Я перепробовал множество вариантов типа
NamingEnumeration results = ctx.search("cn=groups"
, "(&(uid={0},cn=users,o=fund,C=NO)(cn=*))"
, new Object[] {"odd"}
, constraints);
но я получаю только пустые результаты. Кажется все или ничего ... Я подозреваю, что проблема в том, что cn = * и uid = odd находятся на разных уровнях дерева, например. uid = является атрибутом, но cn = * является ли узел на один уровень выше?
Как мне выполнить этот поиск более эффективным способом, чем просто получить все и проанализировать его на стороне клиента?