LDAP新手。我打算使用UnboundID Java API在非常慢的鏈接上檢查LDAP服務器中是否存在〜5K個條目。一個是,我可以使用正確的LDAP搜索選項。或者通過綁定條目的DN來確定條目的存在。 Plz建議,這是快速/最好的方式來做到這一點。LDAP綁定Vs搜索
回答
您絕對不應僅僅爲了確定條目是否存在而執行綁定。有幾個很好的理由:
符合標準的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,因爲它是由服務器返回的。完成後,集合中剩下的條目將成爲服務器中不存在的條目。當然,如果你只想檢查包含大量條目的服務器中的一些條目,這將是一個非常糟糕的主意。
注意的是,在後兩種情況中,你正在試圖確定條目是否存在根據是否在一組搜索結果的返回,你也將受到訪問控制限制。如果您用來綁定到服務器的帳戶沒有權限查看您要檢查的所有條目,那麼您可能錯誤地認爲條目不存在,僅僅是因爲客戶端沒有有權查看它。相反,如果您沒有進行支票的許可,前兩種方法可能會返回「訪問權限不足」的結果,因此也可能會阻止您做出決定。最終,這意味着您應該使用一個您確定有權查看您需要做出決定的所有條目的帳戶。
如果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
}
- 1. C#LDAP搜索沒有綁定
- 2. PHP LDAP搜索
- 3. LDAP搜索失敗
- 4. NPE在LDAP搜索
- 5. 無法搜索LDAP自定義屬性?
- 6. Active Directory自定義搜索LDAP查詢
- 7. 在net-ldap中搜索Ldap Ruby Rails
- 8. 搜索:搜索()vs cts:搜索()在MarkLogic
- 9. LDAP無法綁定
- 10. 綁定dynatable搜索到onchange
- 11. 搜索綁定與get-website?
- 12. LDAP模板搜索屬性
- 13. 使用distinguishedname的LDAP搜索
- 14. PHP LDAP搜索。 EmployeeID缺失
- 15. unboundId LDAP限制搜索
- 16. 在LDAP中搜索用戶
- 17. iOS執行LDAP搜索
- 18. Active Directory上的LDAP搜索
- 19. 搜索LDAP無例外
- 20. PHP遞歸搜索/ LDAP
- 21. LDAP JNDI子樹搜索
- 22. LDAP搜索json輸出
- 23. 在LDAP中搜索條件?
- 24. LDAP搜索引導示例
- 25. Spring LDAP vs UnboundId LDAP
- 26. 如何在使用匿名綁定的同時在LDAP中搜索用戶?
- 27. MarkLogic:Xpath的VS搜索
- 28. wordpress vs solr搜索
- 29. 綁定到LDAP與其他帳戶,然後在LDAP服務器中用密碼搜索用戶
- 30. LDAP服務器vs LDAP sdk
感謝尼爾的解釋。基本上我試圖比較LDIF和LDAP服務器。對於除DN檢查之外的一些條目,我可能不得不拔出一些DN屬性值來進行比較。讓我們來探討一下getEntry API。 – Midson
您可能還想查看Entry.diff方法,該方法可用於查找兩個條目之間的差異,可選地將其限制爲指定的一組屬性。 –
非常全面的答案。榮譽。 –