高级 LDAP 查询

本部分介绍了如何使用 Spring LDAP 进行各种 LDAP 查询。spring-doc.cadn.net.cn

LDAP查询构建器参数

LdapQueryBuilder 及其相关类旨在支持可以提供给 LDAP 搜索的所有参数。 支持以下参数:spring-doc.cadn.net.cn

一个LdapQueryBuilder是通过调用LdapQueryBuilderquery方法创建的。它旨在作为流畅的构建器API,首先定义基础参数,然后调用过滤规范方法进行定义。一旦通过调用LdapQueryBuilderwhere方法开始定义过滤条件,后续尝试调用(例如)base将被拒绝。基础搜索参数是可选的,但至少需要一次过滤规范调用。 以下查询将搜索所有对象类为Person的条目:spring-doc.cadn.net.cn

示例 1. 搜索所有对象类为 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)的条目:spring-doc.cadn.net.cn

示例 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 的条目:spring-doc.cadn.net.cn

示例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且从域组件dcdc=261consulting,dc=com开始的条目的cn(常见名称)属性:spring-doc.cadn.net.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):spring-doc.cadn.net.cn

示例 5. 使用 0 个筛选条件进行搜索
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查询构建器支持以下标准类型:spring-doc.cadn.net.cn

  • is: 指定一个等于(=)条件。spring-doc.cadn.net.cn

  • gte: 指定一个大于等于(>=)条件。spring-doc.cadn.net.cn

  • lte: 指定小于等于(⇐)条件。spring-doc.cadn.net.cn

  • like: 指定一个“类似”条件,其中可以在查询中包含通配符——例如,where("cn").like("J*hn Doe")导致以下过滤器:(cn=J*hn Doe)spring-doc.cadn.net.cn

  • whitespaceWildcardsLike: 指定一个所有空白符都被替换为通配符的条件——例如,where("cn").whitespaceWildcardsLike("John Doe") 将产生如下过滤器:(cn=John*Doe)spring-doc.cadn.net.cn

  • isPresent: 指定一个检查属性是否存在条件 — 例如,where("cn").isPresent() 将产生以下过滤器:(cn=*)spring-doc.cadn.net.cn

  • not: 指定应否定当前条件,例如 where("sn").not().is("Doe) 将生成以下过滤器:(!(sn=Doe))spring-doc.cadn.net.cn

硬编码过滤器

有时,您可能需要指定一个硬编码的过滤器作为输入到LdapQuery中。LdapQueryBuilder为此目的提供了两种方法:spring-doc.cadn.net.cn

  • filter(String hardcodedFilter): 使用指定的字符串作为过滤器。请注意,此方法不会以任何方式修改指定的输入字符串,因此如果您正在从用户输入构建过滤器,则此方法并不特别合适。spring-doc.cadn.net.cn

  • filter(String filterFormat, String…​ params): 使用指定的字符串作为输入到 MessageFormat,正确编码参数并将其插入过滤器字符串中的指定位置。spring-doc.cadn.net.cn

  • filter(Filter filter): 使用指定的过滤器。spring-doc.cadn.net.cn

您不能将硬编码的过滤器方法与前面所述的where方法混合使用。只能选择其中一种方式。如果您通过filter()指定过滤器,则尝试调用where时会引发异常。spring-doc.cadn.net.cn