我仔细阅读了 OpenLDAP 的源代码,发现根 DSE 支持一种称为绝对过滤器的东西。它似乎在RFC4526看起来最初起草该文的作者正在从事 OpenLDAP 项目,所以我不知道这对该特定实现是否有用。
无论如何,RFC 给出了这样的定义:
An 'and' filter consisting of an empty set of filters SHALL evaluate
to True. This filter is represented by the string "(&)".
An 'or' filter consisting of an empty set of filters SHALL evaluate
to False. This filter is represented by the string "(|)"
我的问题是:这有什么用处?我想不出任何例子来说明这能提供一些以前无法做到的事情。如果您想要绝对值,AND
那么您是否不能进行(objectClass=*)
过滤,因为所有条目都必须至少有一个对象类?
我能想到的唯一一个用途是 Absolute False。可能你只是想在服务器上执行一个 noop 以确保通信仍然正常运行。这仍然有点多余,因为我认为查询根 DSE 并丢弃结果会做同样的事情,而且计算成本不会那么高。
使用过滤器会ldapsearch
产生我认为应该预期的结果,如上所述:
[root@hypervisor openldap]# ldapsearch -x -H ldap://policyServer.trunkator.com -b '' -s base "(|)" +
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (|)
# requesting: +
#
# search result
search: 2
result: 0 Success
# numResponses: 1
[root@hypervisor openldap]#
使用绝对真实过滤器返回的结果与我所做的相同(如果您没有在命令行中指定过滤器,则(objectClass=*)
它是 OpenLDAP 客户端的默认过滤器)。ldapsearch
根据 RFC,他们从原始 LDAPv3 RFC 中删除了这些内容,因此作者费尽心思将它们重新添加回来在我只是好奇为什么(我确信是有原因的)。
有任何想法吗?
编辑:
上面的措辞有点糟糕:当我说“根 DSE 支持”时,更清楚的说法是 OpenLDAP 中的根 DSE 是硬编码的,以报告它支持绝对过滤器。
答案1
RFC 的摘要和背景部分明确指出,LDAP v3 忽略了此功能。绝对过滤器的概念显然是 X.500/DAP 的一部分,它们旨在帮助查询可能没有与之关联的对象类的 DSA 特定条目。虽然这显然不是供应商特定的功能,但它的实现留给了供应商(例如,OpenLDAP 似乎已经实现了它)。如果正在使用的目录软件将所有条目(包括 DSA 特定的条目)与对象类(例如,top)相关联,这会使过滤器“(objectclass=*)”的功能就像是一个结果为“true”的绝对过滤器一样,那么它似乎没有多大用处。如果目录软件没有将 DSA 特定的条目与对象类或其他属性相关联,其特定值将在搜索中解析为“true”,那么充当真/假开关的绝对过滤器将成为一种必需的功能(除非目录软件提供了检索此类条目的专有方法,这可能不是一个好主意,因为这种非标准实现将迫使 LDAP 客户端受到供应商的限制/特定)。
答案2
我怀疑这是为了让某些编程结构更容易。例如,如果你在代码中构建了这样的过滤表达式:
filter_string='(&'
for filter in filters:
filter_string = filter_string + '(' + filter + ')'
filter_string = filter_string + ')'
...那么,如果您没有过滤器,则以 结尾(&)
,并且您突出显示的 RFC 部分定义了它应该如何表现。同样的道理也适用于(|)
。