高階 LDAP 查詢
本節介紹如何使用 Spring LDAP 執行各種 LDAP 查詢。
LDAP 查詢構建器引數
LdapQueryBuilder
及其相關類旨在支援 LDAP 搜尋中可以提供的所有引數。支援以下引數:
-
base
: 指定 LDAP 樹中搜索應開始的根 DN。 -
searchScope
: 指定搜尋應遍歷 LDAP 樹的深度。 -
attributes
: 指定要從搜尋中返回的屬性。預設返回所有屬性。 -
countLimit
: 指定從搜尋中返回的最大條目數。 -
timeLimit
: 指定搜尋可能花費的最大時間。 -
搜尋過濾器: 我們正在尋找的條目必須滿足的條件。
透過呼叫 LdapQueryBuilder
的 query
方法來建立 LdapQueryBuilder
。它被設計為一種流式構建器 API,其中首先定義基本引數,然後是過濾器規範呼叫。一旦開始使用 LdapQueryBuilder
的 where
方法定義過濾器條件,後續嘗試呼叫(例如)base
將被拒絕。基本搜尋引數是可選的,但至少需要一個過濾器規範呼叫。以下查詢搜尋所有物件類為 Person
的條目:
Person
的條目import static org.springframework.ldap.query.LdapQueryBuilder.query;
...
List<Person> persons = ldapClient.search()
.query(query().where("objectclass").is("person"))
.toList(new PersonAttributesMapper());
以下查詢搜尋所有物件類為 person
且 cn
(通用名)為 John Doe
的條目:
person
且 cn=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
(域元件)開始的條目:
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
(通用名)屬性:
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
) 的多種拼寫形式:
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
將會丟擲異常。