在java中进行ldap搜索 - 查找包含特定用户的所有组

时间:2011-05-09 23:08:01

标签: ldap

给出以下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"
                , "(&(uid={0},cn=users,o=fund,C=NO)(cn=*))"
                        , new Object[] {"odd"}
                        , constraints);

但我只得到空的结果。似乎全部或全部......我怀疑问题是cn = *和uid = odd在树中的不同层次上,例如。 uid =是一个属性,但cn = *是一个以上的节点?

如何以更有效的方式完成此搜索,而不仅仅是检索所有内容并将其解析为客户端?

1 个答案:

答案 0 :(得分:0)

您的LDAP结构看起来很奇怪。

cn=group1这样的对象类是什么?这是“organizationalUnit”还是“group”?

在通常的目录中,用户是在基于“organizationalUnits”类的对象下创建的,对于管理需求,用户将其分组到“group”类对象的名为“member”的属性中。

在这种情况下,LDAP过滤器将类似于:

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

根据您描述的架构,您可能会看到一个名为 ExtensibleMatch 的功能,似乎在this wiki article中已正确解释。