2013-04-18 103 views
3

LDAP新手。我打算使用UnboundID Java API在非常慢的鏈接上檢查LDAP服務器中是否存在〜5K個條目。一個是,我可以使用正確的LDAP搜索選項。或者通過綁定條目的DN來確定條目的存在。 Plz建議,這是快速/最好的方式來做到這一點。LDAP綁定Vs搜索

回答

6

您絕對不應僅僅爲了確定條目是否存在而執行綁定。有幾個很好的理由:

  • 符合標準的LDAP服務器應該返回一個「無效憑證」響應兩個在你試圖綁定爲那並不是一個用戶的情況下您是否存在以及您嘗試使用錯誤的密碼進行綁定的情況。因此,如果您不知道用戶的密碼(如果您甚至不知道用戶是否存在,這是一個相當不錯的選擇),那麼您不能使用綁定區分缺少的用戶和錯誤的用戶密碼。

  • 綁定嘗試可能導致寫入目標條目,這可能會顯着降低性能。如果嘗試使用錯誤的密碼進行綁定,則服務器可能會配置爲跟蹤失敗的身份驗證嘗試,並且在某些情況下甚至可能會鎖定用戶。即使您使用正確的密碼進行綁定,也可以將服務器配置爲更新條目(例如,記錄上次登錄時間)。

還有其他幾個選項可以考慮。它們包括:

  • 作爲特里建議的,執行爲每個條目的基級搜索(其是LDAPConnection.getEntry方法所做的)設定的「1.1」,這意味着沒有屬性的請求的屬性。如果條目不存在,您將得到「無此對象」結果(這會導致LDAP SDK引發LDAPException)。如果條目確實存在,那麼您將返回僅帶有DN的搜索結果條目,然後是搜索結果完成響應。

  • 作爲使用基本級搜索的替代方法,您可以使用LDAP比較操作。如果只想知道條目是否存在,這比搜索更有效,因爲每個條目(比較結果)只有一個響應而不是兩個(搜索結果條目和搜索結果)。如果條目存在,則根據條目是否與比較斷言相匹配,您將得到「比較真實」或「比較假」的響應。如果條目不存在,那麼你將得到一個帶有「no such object」結果的LDAPException。

  • 如果您使用的服務器支持entryDN操作屬性(如RFC 5020中所述),那麼您可以執行一次可用於檢索多個條目的搜索。例如,您可以構建一個類似於「(|(entryDN = uid = user.1,dc = example,dc = com)(entryDN = uid = user.2,dc = example,dc = com)的過濾器(entryDN = uid = user.3,DC =例如,DC = COM)(entryDN = UID =用戶。4,dc = example,dc = com)(entryDN = uid = user.5,dc = example,dc = com))「這個例子適用於單個搜索請求,可以用來確定這五個條目中的哪一個存在,而不是爲每個條目提供單獨的請求和響應,您將得到一個請求,最多有五個搜索結果條目響應和一個搜索結果完成響應,我絕對不會推薦構建一個具有5000個元素的OR過濾器,但你仍然可以使用它來顯着減少你需要執行的搜索請求的數量

  • 如果你使用的目錄沒有比你試圖檢查的目錄多得多的條目,那麼你可以只需創建一個包含要查找的DN的集合,執行子樹「(objectClass = *)」搜索,然後從服務器中刪除每個條目的DN,因爲它是由服務器返回的。完成後,集合中剩下的條目將成爲服務器中不存在的條目。當然,如果你只想檢查包含大量條目的服務器中的一些條目,這將是一個非常糟糕的主意。

注意的是,在後兩種情況中,你正在試圖確定條目是否存在根據是否在一組搜索結果的返回,你也將受到訪問控制限制。如果您用來綁定到服務器的帳戶沒有權限查看您要檢查的所有條目,那麼您可能錯誤地認爲條目不存在,僅僅是因爲客戶端沒有有權查看它。相反,如果您沒有進行支票的許可,前兩種方法可能會返回「訪問權限不足」的結果,因此也可能會阻止您做出決定。最終,這意味着您應該使用一個您確定有權查看您需要做出決定的所有條目的帳戶。

+0

感謝尼爾的解釋。基本上我試圖比較LDIF和LDAP服務器。對於除DN檢查之外的一些條目,我可能不得不拔出一些DN屬性值來進行比較。讓我們來探討一下getEntry API。 – Midson

+1

您可能還想查看Entry.diff方法,該方法可用於查找兩個條目之間的差異,可選地將其限制爲指定的一組屬性。 –

+0

非常全面的答案。榮譽。 –

1

不要搜索,如果你不必。如果你已經知道DN,只需綁定它。

然而,通常的情況是,您知道別的東西,即屬性值,如maildisplayName,因此您必須先搜索才能找到具有該屬性的條目,然後綁定該條目的DN。

+0

1)對於一些條目,我必須獲取要比較的屬性值。那麼在這種情況下,綁定不起作用? 2)在服務器端,多重綁定會導致任何大量? – Midson

+0

@Midson如果你沒有DN,你必須搜索。你關於「任何充足」的問題都沒有意義。 – EJP

+0

對不起。錯字,這是懲罰。 – Midson

2

如果DN是已知的,然後客戶端正在檢查存在和未驗證,請檢索1.1 OID(無屬性),而不是BIND。 BIND通常比搜索慢。例如:

try { 
    // Connect to the server 
    LDAPConnection ldapConnection = new LDAPConnection(...); 
    try { 
     for(String dn:listOfDns) { 
      Entry entry = ldapConnection.getEntry(dn,"1.1"); 
     } 
    } catch(LDAPException ex) { 
     // handle an exception from the search 
    } finally { 
     ldapConnection.close(); 
    } 
} catch(LDAPException ex) { 
     // handle an exception from the connection attempt 
}