LDAP 过滤器功能强大,但我不知道如何根据 DN 搜索对象。我已经有许多过滤器可以搜索对象,但似乎不支持搜索特定 DN。
例如我有
&(objectclass=top)(uid=myspecialuser)(aci=*)
这将返回一个具有一个或多个aci
属性的 uid 等于 myspecialuser 的对象。
由于我不能完全理解的原因,LDAP 不允许我使用 DN 搜索对象,例如
&(objectclass=top)(dn=cn=myspecialuser,o=special,c=NL)
事实上,如果没有唯一属性来搜索对象,使用过滤器选择对象似乎根本是不可能的。您根本无法搜索 DN。
这是正确的吗?没有办法根据 DN 过滤搜索?
答案1
a) 所有 LDAP 服务器:指定 DN 作为搜索的“基础”
LDAP 的“搜索”操作有一个特定的方法可以轻松完成此操作 - 不是通过过滤器,而是通过“base DN”参数(通常与‘base’一起作为搜索范围)。
例如,不是进行典型的“子树”搜索......
base: o=Special,c=NL
scope: sub
filter: (&(uid=myspecialuser)(aci=*))
...您可以选择这样的特定条目:
基础:cn=我的特殊用户,o=特殊,c=NL 范围:根据 过滤器:(objectClass=*)
“基本”范围可防止搜索返回任何不需要的子条目,因此您只能获得您要求的 DN。
(但是,除此之外它没有添加任何魔力——您可以指定具有任何范围的任何基础。)
b) 某些 LDAP 服务器:可过滤镜像 DN 的操作属性
确实标准LDAP 您无法编写与特定 DN 匹配的过滤器,因此如果您想检索多个条目,则需要发出多个“基本”搜索查询,每个 DN 一个。(这通常不是问题,因为您可以异步发送一堆请求,然后一次等待所有请求。)
然而,一些LDAP 实现确实具有包含条目 DN 的自定义操作属性,它能与之匹配。
例如,微软活动目录具有
distinguishedName
操作属性:filter: (|(distinguishedName=cn=My special user,o=Special,c=NL) (distinguishedName=cn=Other special user,o=Special,c=NL))
OpenLDAP 具有标准
entryDN
操作属性。389 目录服务器似乎有
entryDN
,但我还没有真正检查是否可以搜索。
要查看条目的所有操作属性,只需进行常规搜索,但指定+
通配符在“想要的属性”参数中(而不是通常的*
)。
c) 一些 LDAP 服务器:按单个 DN 组件进行过滤
顺便提一下,是过滤器语法(可扩展匹配) 允许匹配单个 DN 属性,就像匹配条目属性一样。
例如,(o:dn:=Special)
将匹配 DN 中任何位置包含 的所有条目o=Special
,即使该条目本身中不存在该条目,因此会匹配 的所有子项o=Special
。
然而,这是不是得到广泛支持;特别是您不能将它与 Active Directory 一起使用(但可以在 OpenLDAP 中使用)。