|
对于最新稳定版本,请使用 Spring LDAP 4.0.2! |
高级 LDAP 查询
本部分介绍了如何使用 Spring LDAP 进行各种 LDAP 查询。
LDAP查询构建器参数
LdapQueryBuilder 及其相关类旨在支持可以提供给 LDAP 搜索的所有参数。 支持以下参数:
-
base: 指定在LDAP树中搜索应从哪个根DN开始。 -
searchScope: 指定搜索应遍历LDAP树的深度。 -
attributes: 指定从搜索中返回的属性。默认为所有。 -
countLimit: 指定从搜索中返回的最大条目数。 -
timeLimit: 指定搜索最多可花费的时间。 -
搜索过滤器: 项目我们必须寻找的条目必须满足的条件。
一个LdapQueryBuilder是通过调用LdapQueryBuilder的query方法创建的。它旨在作为流畅的构建器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 且 common name 为 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):
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时会引发异常。