高階 LDAP 查詢

本節介紹如何使用 Spring LDAP 執行各種 LDAP 查詢。

LDAP 查詢構建器引數

LdapQueryBuilder 及其相關類旨在支援 LDAP 搜尋中可以提供的所有引數。支援以下引數:

  • base: 指定 LDAP 樹中搜索應開始的根 DN。

  • searchScope: 指定搜尋應遍歷 LDAP 樹的深度。

  • attributes: 指定要從搜尋中返回的屬性。預設返回所有屬性。

  • countLimit: 指定從搜尋中返回的最大條目數。

  • timeLimit: 指定搜尋可能花費的最大時間。

  • 搜尋過濾器: 我們正在尋找的條目必須滿足的條件。

透過呼叫 LdapQueryBuilderquery 方法來建立 LdapQueryBuilder。它被設計為一種流式構建器 API,其中首先定義基本引數,然後是過濾器規範呼叫。一旦開始使用 LdapQueryBuilderwhere 方法定義過濾器條件,後續嘗試呼叫(例如)base 將被拒絕。基本搜尋引數是可選的,但至少需要一個過濾器規範呼叫。以下查詢搜尋所有物件類為 Person 的條目:

示例 1. 搜尋所有物件類為 Person 的條目
import static org.springframework.ldap.query.LdapQueryBuilder.query;
...

List<Person> persons = ldapClient.search()
      .query(query().where("objectclass").is("person"))
      .toList(new PersonAttributesMapper());

以下查詢搜尋所有物件類為 personcn(通用名)為 John Doe 的條目:

示例 2. 搜尋所有物件類為 personcn=John Doe 的條目
import static org.springframework.ldap.query.LdapQueryBuilder.query;
...

List<Person> persons = ldapClient.search()
      .query(query().where("objectclass").is("person").and("cn").is("John Doe"))
      .toList(new PersonAttributesMapper());

以下查詢搜尋所有物件類為 person 且從 dc=261consulting,dc=com(域元件)開始的條目:

示例 3. 搜尋所有物件類為 person 且從 dc=261consulting,dc=com 開始的條目
import static org.springframework.ldap.query.LdapQueryBuilder.query;
...

List<Person> persons = ldapClient.search()
      .query(query().base("dc=261consulting,dc=com").where("objectclass").is("person"))
      .toList(new PersonAttributesMapper());

以下查詢返回所有物件類為 person 且從 dc=261consulting,dc=com(域元件)開始的條目的 cn(通用名)屬性:

示例 4. 搜尋所有類為 Person 且從 dc=261consulting,dc=com 開始的條目,僅返回 cn 屬性
import static org.springframework.ldap.query.LdapQueryBuilder.query;
...

Stream<Person> persons = ldapClient.search()
      .query(query().base("dc=261consulting,dc=com")
             .attributes("cn")
             .where("objectclass").is("person")),
      .toStream(new PersonAttributesMapper());

以下查詢使用 or 搜尋通用名 (cn) 的多種拼寫形式:

示例 5. 使用 or 條件進行搜尋
import static org.springframework.ldap.query.LdapQueryBuilder.query;
...
Stream<Person> persons = ldapClient.search()
      .query(query().where("objectclass").is("person"),
             .and(query().where("cn").is("Doe").or("cn").is("Doo"))
      .toStream(new PersonAttributesMapper());

過濾器條件

前面的示例演示了 LDAP 過濾器中的簡單等於條件。LDAP 查詢構建器支援以下條件型別:

  • is: 指定等於 (=) 條件。

  • gte: 指定大於或等於 (>=) 條件。

  • lte: 指定小於或等於 (⇐) 條件。

  • like: 指定“類似”條件,可以在查詢中包含萬用字元——例如,where("cn").like("J*hn Doe") 會產生以下過濾器:(cn=J*hn Doe)

  • whitespaceWildcardsLike: 指定一個條件,其中所有空白字元都替換為萬用字元——例如,where("cn").whitespaceWildcardsLike("John Doe") 會產生以下過濾器:(cn=John*Doe)

  • isPresent: 指定一個條件,檢查屬性是否存在——例如,where("cn").isPresent() 會產生以下過濾器:(cn=*)

  • not: 指定當前條件應被否定——例如,where("sn").not().is("Doe) 會產生以下過濾器:(!(sn=Doe))

硬編碼過濾器

有時,您可能希望將硬編碼過濾器指定為 LdapQuery 的輸入。LdapQueryBuilder 為此提供了兩個方法:

  • filter(String hardcodedFilter): 使用指定的字串作為過濾器。請注意,指定的輸入字串不會以任何方式修改,這意味著如果從使用者輸入構建過濾器,此方法並非特別適用。

  • filter(String filterFormat, String…​ params): 使用指定的字串作為 MessageFormat 的輸入,正確編碼引數並將其插入到過濾器字串的指定位置。

  • filter(Filter filter): 使用指定的過濾器。

您不能將硬編碼過濾器方法與前面描述的 where 方法混合使用。只能選擇其中一種。如果您使用 filter() 指定過濾器,之後再嘗試呼叫 where 將會丟擲異常。