高階 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 (域元件) 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 (域元件) 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: 指定“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 將會丟擲異常。