2

我在为 LDAP 查询编写过滤器时遇到问题。

我有两个对象类——Person 和 Service。数据库由许多人组成,每个人都有零个或多个子服务。每个人都有一个标识符 personNumber 属性。我想选择几个人和他们给定人员编号的所有服务。是否可以在一个查询中执行此操作?

例如,如果我们有以下一组对象:

                personNumber=1,ou=root,o=org
serviceNumber=1,personNumber=1,ou=root,o=org
serviceNumber=2,personNumber=1,ou=root,o=org
                personNumber=2,ou=root,o=org
serviceNumber=3,personNumber=2,ou=root,o=org
                personNumber=3,ou=root,o=org
serviceNumber=4,personNumber=3,ou=root,o=org

,是否有可能,给定人号 1 和 2,检索这些对象:

                personNumber=1,ou=root,o=org
serviceNumber=1,personNumber=1,ou=root,o=org
serviceNumber=2,personNumber=1,ou=root,o=org
                personNumber=2,ou=root,o=org
serviceNumber=3,personNumber=2,ou=root,o=org

但不是这些:

                personNumber=3,ou=root,o=org
serviceNumber=4,personNumber=3,ou=root,o=org

只使用一个查询?这是一个例子;可以加载两个以上的标识符。它们不是先验已知的。

IN (..)另外,除了生成大(|(a=..)(a=..)(a=..)..)过滤器之外,有没有办法指定属性值应该在一些值集合中,比如SQL 中的子句?

4

2 回答 2

2

答案是否定的,根据 RFC https://www.rfc-editor.org/rfc/rfc2254,没有这样的过滤器。如果 IN 列表很大并且您在 ldap 中有很多人,您需要编写一个简单的分页查询使用 (objectClass=Person) 过滤器获取所有结果,并在重试后过滤结果。如果您的代码是用 Java 编写的,您可以签 出 unboundid LDAP SDK

于 2012-08-17T08:45:03.137 回答
1

If person doesn't have a multivalued attribute holding the service there is no way this can be returned in one ldapsearch. You'll need at least a two stage rocket: first select person, for each person check on childnodes.

AFAIK there is no IN operator in LDAP filters. The RFC is clear about that. So you're stuck with your tedious (|(a=s1)(a=s2)(a=s3)...) construct.

于 2012-08-17T09:06:02.757 回答