繁体   English   中英

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

[英]ldap search in java - finding all groups with a specific user in it

鉴于以下 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=*是上一级的节点?

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

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

什么是像cn=group1这样的对象类? 这是“组织单位”还是“组”?

在通常的目录中,用户是在基于“organizationalUnits”类的对象下创建的,并且为了管理需要,它们被分组在一个称为“group”类对象的“成员”的属性中。

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

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

对于您描述的架构,您可能会查看一个名为ExtensibleMatch的功能,该功能似乎在这篇 wiki 文章中得到了正确解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM