2011-05-09 176 views
0

鑑於下面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://服務器:端口/ 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 = *是上面一個節點的節點?

我會如何以更有效的方式完成此搜索,而不僅僅是檢索所有內容並將其解析爲客戶端?

回答

0

您的LDAP結構看起來很奇怪。

cn=group1這樣的對象是什麼類?這是「組織單位」還是「組」?

在平常的目錄中,用戶是在基於「organizationalUnits」類的對象下創建的,爲了管理需要,它們被分組在類「group」的對象的「成員」屬性中。

在這種情況下,LDAP過濾器會是這樣:

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

隨着架構你discribe你可以看下一個叫ExtensibleMatch功能,這似乎在this wiki article正確解釋。

+0

謝謝,它的工作原理,我從網上挖出了類似的東西。 objectClass = accessGroup,結構是遺留的。 – 2011-05-11 19:14:12

相關問題