高级 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 (域组件) 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 (域组件) 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: 指定“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 将会抛出异常。

© . This site is unofficial and not affiliated with VMware.