编写LDAP查询过滤器
我无法为LDAP查询编写过滤器。编写LDAP查询过滤器
我有两个对象类 - 人员和服务。数据库由许多人组成,每个人都有零个或更多的儿童服务。每个人都有一个标识符,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
,?这是一个例子;可以加载两个以上的标识符。他们不是先验的。
另外,有没有一种方法来指定该属性值应该在一些值的集合中,例如SQL中的IN (..)
子句,而不是生成大的(|(a=..)(a=..)(a=..)..)
筛选器?
如果人员没有持有该服务的多值属性,则无法在一个ldapsearch中返回该值。你至少需要两个阶段的火箭:第一个选择人员,每个人检查一下孩子节点。
AFAIK LDAP过滤器中没有IN操作符。 RFC很明确。所以你被困在你单调乏味的(|(a = s1)(a = s2)(a = s3)...)结构中。
答案是否定的,根据RFC http://tools.ietf.org/html/rfc2254,没有这样的过滤器。如果IN列表非常大并且在ldap中有很多人,则需要编写一个简单的分页查询来获取所有结果(objectClass = Person)过滤器,并在重试后过滤结果。如果您的代码是用Java编写的,则可以结算unboundid LDAP SDK
谢谢你的回答。是的,我们正在使用Java,但是,不幸的是,除了JNDI工具之外,我无法使用任何其他工具。 – 2012-08-17 09:02:28
请查看[链接](http://docs.oracle.com/javase/1.5.0/docs/api/javax/naming/ldap/PagedResultsControl.html) – 2012-08-17 09:12:15
再次感谢您,这是非常有用的。 – 2012-08-17 09:22:52
我不明白你的问题的第一部分。如果您发现每个找到的节点的人员节点,您必须检索子项(您的案例中的服务)。 LDAP不做汇总。第二部分可能不是,根据这个规范:http://tools.ietf.org/html/rfc4515 – rene 2012-08-17 08:01:04
@rene我已经添加了一个例子来说明我想要做什么。 – 2012-08-17 08:12:11
这使得它更清晰。人有(多值)属性,将其链接到服务或是唯一与ldap层次关系的关系?在后一种情况下,你不能有这样的结果。 – rene 2012-08-17 08:19:12