本节介绍如何在Spring LDAP中使用LDAP查询的各种方法。

LDAP 查询生成器参数

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

  • base:指定 LDAP 树中应开始搜索的根 DN。

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

  • attributes:指定要从搜索返回的属性。默认值为 all。

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

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

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

通过调用 的方法创建一个 。它旨在作为一个流畅的构建器 API,其中首先定义基本参数,然后调用过滤器规范。一旦开始使用调用 的方法定义筛选条件,以后的调用尝试(例如)将被拒绝。基本搜索参数是可选的,但至少需要调用一个筛选器规范。 以下查询搜索对象类为 :LdapQueryBuilderqueryLdapQueryBuilderwhereLdapQueryBuilderbasePerson

例 1.搜索具有对象类的所有条目Person
import static org.springframework.ldap.query.LdapQueryBuilder.query;
...

List<Person> persons = ldapClient.search()
      .query(query().where("objectclass").is("person"))
      .toList(new PersonAttributesMapper());

以下查询搜索对象类为 且(公用名)为 的所有条目:personcnJohn 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());

以下查询搜索对象类为 且从 (域组件) 开始的所有条目:persondcdc=261consulting,dc=com

例 3.搜索对象类从persondc=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());

以下查询返回对象类为 且从 (域组件) 开始的所有条目的 (common name) 属性:cnpersondcdc=261consulting,dc=com

例 4.搜索类以 开头的所有条目,仅返回属性Persondc=261consulting,dc=comcn
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());

以下查询用于搜索公用名 () 的多个拼写:orcn

例 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))

硬编码过滤器

在某些情况下,您可能希望将硬编码筛选器指定为 . 为此,有两种方法:LdapQueryLdapQueryBuilder

  • filter(String hardcodedFilter):使用指定的字符串作为筛选器。请注意,指定的输入字符串不会以任何方式触及,这意味着如果要从用户输入生成筛选器,则此方法不是特别适合。

  • filter(String filterFormat, String…​ params):使用指定的字符串作为输入,正确编码参数并将其插入筛选器字符串中的指定位置。MessageFormat

  • filter(Filter filter):使用指定的筛选器。

不能将硬编码的筛选器方法与前面所述的方法混合使用。它要么是其中之一,要么是另一个。如果使用 指定筛选器,则在之后尝试调用时会出现异常。wherefilter()where