【问题标题】:Writing LDAP query filter编写 LDAP 查询过滤器
【发布时间】:2012-08-17 07:46:28
【问题描述】:

我在为 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

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

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

【问题讨论】:

  • 我不明白你问题的第一部分。如果您为每个找到的节点找到 people 节点,则必须检索子节点(在您的情况下为服务)。 LDAP 不进行汇总。根据这个规范,第二部分可能不是:tools.ietf.org/html/rfc4515
  • @rene 我在我想做什么的问题中添加了一个示例。
  • 这样就更清楚了。人是否具有将其链接到服务的(多值)属性,或者是 ldap 层次结构的唯一关系?在后一种情况下,你不能得到这样的结果。
  • @rene 不,它只是 LDAP 层次结构。谢谢你。如果您回答正确,我会将您的答案标记为已接受。

标签: filter ldap jndi ldap-query


【解决方案1】:

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

【讨论】:

【解决方案2】:

如果 person 没有持有服务的多值属性,则无法在一个 ldapsearch 中返回它。您至少需要一个两级火箭:首先选择人员,然后为每个人员检查子节点。

AFAIK LDAP 过滤器中没有 IN 运算符。 RFC 对此很清楚。所以你被你乏味的 (|(a=s1)(a=s2)(a=s3)...) 结构困住了。

【讨论】:

    猜你喜欢
    • 2022-12-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 2022-08-24
    相关资源
    最近更新 更多