進階 LDAP 查詢

本節涵蓋如何使用 Spring LDAP 進行 LDAP 查詢的各種方法。

LDAP 查詢建構器參數

LdapQueryBuilder 及其相關類別旨在支援可以提供給 LDAP 搜尋的所有參數。 支援以下參數

  • base:指定 LDAP 樹狀結構中搜尋應開始的根 DN。

  • searchScope:指定搜尋應在 LDAP 樹狀結構中遍歷的深度。

  • attributes:指定要從搜尋傳回的屬性。 預設值為全部。

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

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

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

LdapQueryBuilder 是透過呼叫 LdapQueryBuilderquery 方法來建立的。 它旨在作為流暢的建構器 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=comdc (網域元件) 開始的所有條目

範例 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=comdc (網域元件) 開始的所有條目的 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:指定 “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,將會收到例外狀況。