2012-08-17 73 views
2

我無法爲LDAP查詢編寫過濾器。編寫LDAP查詢過濾器

我有兩個對象類 - 人員和服務。數據庫由許多人組成,每個人都有零個或更多的兒童服務。每個人都有一個標識符,personNumber屬性。我想選擇幾個人和所有他們的服務給定人數。在一個查詢中可以這樣做嗎?

例如,如果我們有如下的一組對象:

   personNumber=1,ou=root,o=org 
serviceNumber=1,personNumber=1,ou=root,o=org 
serviceNumber=2,personNumber=1,ou=root,o=org 
       personNumber=2,ou=root,o=org 
serviceNumber=3,personNumber=2,ou=root,o=org 
       personNumber=3,ou=root,o=org 
serviceNumber=4,personNumber=3,ou=root,o=org 

,是有可能,因爲人的數字1和2,檢索這些對象:

   personNumber=1,ou=root,o=org 
serviceNumber=1,personNumber=1,ou=root,o=org 
serviceNumber=2,personNumber=1,ou=root,o=org 
       personNumber=2,ou=root,o=org 
serviceNumber=3,personNumber=2,ou=root,o=org 

但不是這些:

只使用一個查詢
   personNumber=3,ou=root,o=org 
serviceNumber=4,personNumber=3,ou=root,o=org 

?這是一個例子;可以加載兩個以上的標識符。他們不是先驗的。

另外,有沒有一種方法來指定該屬性值應該在一些值的集合中,例如SQL中的IN (..)子句,而不是生成大的(|(a=..)(a=..)(a=..)..)篩選器?

+0

我不明白你的問題的第一部分。如果您發現每個找到的節點的人員節點,您必須檢索子項(您的案例中的服務)。 LDAP不做彙總。第二部分可能不是,根據這個規範:http://tools.ietf.org/html/rfc4515 – rene 2012-08-17 08:01:04

+0

@rene我已經添加了一個例子來說明我想要做什麼。 – 2012-08-17 08:12:11

+0

這使得它更清晰。人有(多值)屬性,將其鏈接到服務或是唯一與ldap層次關係的關係?在後一種情況下,你不能有這樣的結果。 – rene 2012-08-17 08:19:12

回答

1

如果人員沒有持有該服務的多值屬性,則無法在一個ldapsearch中返回該值。你至少需要兩個階段的火箭:第一個選擇人員,每個人檢查一下孩子節點。

AFAIK LDAP過濾器中沒有IN操作符。 RFC很明確。所以你被困在你單調乏味的(|(a = s1)(a = s2)(a = s3)...)結構中。

2

答案是否定的,根據RFC http://tools.ietf.org/html/rfc2254,沒有這樣的過濾器。如果IN列表非常大並且在ldap中有很多人,則需要編寫一個簡單的分頁查詢來獲取所有結果(objectClass = Person)過濾器,並在重試後過濾結果。如果您的代碼是用Java編寫的,則可以結算unboundid LDAP SDK

+0

謝謝你的回答。是的,我們正在使用Java,但是,不幸的是,除了JNDI工具之外,我無法使用任何其他工具。 – 2012-08-17 09:02:28

+1

請查看[鏈接](http://docs.oracle.com/javase/1.5.0/docs/api/javax/naming/ldap/PagedResultsControl.html) – 2012-08-17 09:12:15

+0

再次感謝您,這是非常有用的。 – 2012-08-17 09:22:52