根据 php.net 手册中的这些帖子,应该可以为ldap_search()
提供多个DN。
但是,我无法使以下实现正常工作:
$dn[] = 'ou=Red,ou=Teams,ou=Users,dc=example,dc=org';
$dn[] = 'ou=Green,ou=Teams,ou=Users,dc=example,dc=org';
$dn[] = 'ou=Blue,ou=Teams,ou=Users,dc=example,dc=org';
$query = ldap_search($conn, $dn, $filter, $attrs);
通过任何单独的 DN 字符串时一切都很好,但提供数组将出现错误消息:"没有这样的对象"。
一个明显的解决方法是遍历我的 DN 数组以触发单独的查询并将所有内容推送到一个数组中。我想避免这样做,因为我在一个 DN(分页 - 示例 2(中带回 8000+ 个对象,在其他两个 DN 中各带回 ~300 个对象。
实际上是否可以搜索多个 DN?也许单个 DN 字符串中的特殊语法(符号/字符(?
搜索请求必须至少包含以下参数:
- 搜索开始的位置的基本对象(不返回基对象上方的对象(
- 搜索范围:
base
是基本对象本身,one
是基本对象,并且比基对象低一级,sub
是基对象和基对象下的所有条目。 - 一个过滤器,它将返回的条目限制为与断言匹配的条目滤波器
还可以提供属性列表,尽管许多(但不是全部(LDAP API 将请求所有用户属性(如果未在搜索请求中提供(。
在列出的情况下,将基本对象设置为 ou=users,dc=example,dc=com
并使用适当的滤波器。如果 LDAP 客户机必须将返回的条目限制为从属条目要ou=red
、ou=green
或ou=blue
,可以使用复合可扩展匹配筛选器像(&(objectClass=inetOrgPerson)(|(ou:dn:=red)(ou:dn:=green)(ou:dn:=blue)))
一样 - 使用正确的对象类,如果数据不使用 inetOrgPerson
。所有符合 LDAP 标准的服务器都支持可扩展匹配筛选器,但不兼容的服务器可能不支持此标准筛选器。
使用多个基本对象,scope
参数定义有多少从属对象级别(如果有(在基本对象下方进行检查。
参见
- LDAP:掌握搜索过滤器
- LDAP:搜索最佳做法
- LDAP:编程实践
你在手册中看到这个了吗?
这些数组的大小必须与链接标识符数组的大小相同,因为数组的第一个条目用于一个搜索,第二个条目用于另一个搜索,依此类推。
基本上,$conn
变量需要是一个连接数组,等于$dn
数组的大小。
如果 $dn
数组中有 3 个元素,则 $conn
数组中需要 3 个元素:
$ds = ldap_connect($ldapserver);
$dn[] = 'ou=Red,ou=Teams,ou=Users,dc=example,dc=org';
$dn[] = 'ou=Green,ou=Teams,ou=Users,dc=example,dc=org';
$dn[] = 'ou=Blue,ou=Teams,ou=Users,dc=example,dc=org';
// Match connection elements to count of dn elements
for($x=0, $x < count($dn), $x++)
{
$conn[] = $ds;
}
$query = ldap_search($conn, $dn, $filter, $attrs);