我正在仔细阅读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中删除了这些,因此作者遇到了将它们添加回来的麻烦,我只是好奇为什么(我确定这是有原因的).
有任何想法吗?
编辑:
有点糟糕的措辞:当我说“root DSE支持”时,更明确的方式是说OpenLDAP中的根DSE是硬编码的,以报告它支持绝对过滤器.
RFC的摘要和背景部分明确指出在LDAP v3中忽略了此功能.绝对过滤器的概念显然是X.500 / DAP的一部分,它们旨在帮助查询特定于DSA的条目,这些条目可能没有与之关联的对象类.虽然这显然不是供应商特定的功能,但它的实现留给了供应商(例如,OpenLDAP似乎已经实现了它).如果使用的目录软件将包括DSA特定条目的所有条目与对象类(例如,顶部)相关联,这使得过滤器'(objectclass = *)’函数就好像它是绝对过滤器一样,这似乎不是非常有用.这导致’真实’.如果目录软件不将DSA特定条目与对象类或其特定值在搜索中解析为“true”的其他属性相关联,则充当真/假开关的绝对过滤器将成为所需特征的一部分(除非目录软件提供检索此类条目的专有方法,这可能不是一个好主意,因为此类非标准实现将强制LDAP客户端受供应商限制/特定).