高级 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
对象类和 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
)的多种拼写方式。
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
会导致异常。