Advanced LDAP Queries

本部分介绍如何使用 Spring LDAP 与 LDAP 查询。

LDAP Query Builder Parameters

LdapQueryBuilder 及其关联类旨在支持可以提供给 LDAP 搜索的所有参数。支持以下参数:

  • base: 指定应该从哪个 LDAP 树的根 DN 开始进行搜索。

  • searchScope: 指定搜索应该遍历 LDAP 树的深度。

  • attributes: 指定从搜索中返回的属性。默认设置为全部。

  • countLimit: 指定从搜索中返回的最大条目数量。

  • timeLimit: 指定搜索可能花费的最大时间。

  • 搜索过滤器:我们要查找的条目必须满足的条件。

使用 LdapQueryBuilderquery 方法调用创建一个 LdapQueryBuilder。它被视为一种流畅的构建器 API,其中首先定义基本参数,随后是过滤器规范调用。一旦使用 LdapQueryBuilderwhere 方法开始定义过滤器条件,则稍后尝试调用(例如)base 将被拒绝。基本搜索参数是可选的,但至少需要一个过滤器规范调用。以下查询搜索具有 Person 对象类的所有条目:

Example 1. Search for all entries with object class 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 的所有条目:

Example 2. Search for all entries with object class person and 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 的所有条目:

Example 3. Search for all entries with object class person starting at 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(通用名称)属性:

Example 4. Search for all entries with class Person starting at dc=261consulting,dc=com, returning only the cn attribute
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) 的多种拼写:

Example 5. Search with or criteria
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());

Filter Criteria

早期的例子演示了 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))`。

Hardcoded Filters

有时您可能希望指定硬编码过滤器作为 LdapQuery 的输入。LdapQueryBuilder 有两种方法可以实现此目的:

  • filter(String hardcodedFilter): 将指定字符串用作过滤器。请注意,不会以任何方式触及指定的输入字符串,这意味着如果您要从用户输入构建过滤器,则此方法并不是特别合适。

  • filter(String filterFormat, String&#8230;&#8203; params): 将指定字符串用作 `MessageFormat`的输入,正确地对参数进行编码,并将其插入过滤器字符串中的指定位置。

  • filter(Filter filter): 使用指定过滤器。

您不能将硬编码过滤器方法与前面描述的 where 方法混合使用。只能选择其中一种。如果您使用 filter() 指定过滤器,那么尝试在之后调用 where 时您将收到一个异常。