LDAP在PHP中搜索多个DN

时间:2012-05-09 12:42:07

标签: php ldap

根据 these 中的posts php.net manual,应该可以为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 (Paginated - Example 2) 中带回了8000多个对象,而在另外两个DN中带回了大约300个。

实际上是否可以搜索多个DN? 也许是单个DN字符串中的特殊语法(符号/字符)?

2 个答案:

答案 0 :(得分:3)

搜索请求必须至少包含以下参数:

  • 搜索开始的基础对象(不返回基础对象上方的对象)
  • 搜索范围:base是基础对象本身,one是基础对象, 在基础对象下一级,sub是基础对象,基础对象下面的所有条目。
  • 一个过滤器,它将返回的条目限制为与该断言匹配的条目 过滤

也可以提供属性列表,但很多(但不是全部)LDAP API都会请求所有属性 用户属性,如果搜索请求中没有提供。

在列出的案例中,将基础对象设置为ou=users,dc=example,dc=com并使用适当的对象 过滤。如果LDAP客户端必须将返回的条目限制为从属条目 到ou=redou=greenou=blue可以使用复合可扩展匹配过滤器 像(&(objectClass=inetOrgPerson)(|(ou:dn:=red)(ou:dn:=green)(ou:dn:=blue)))一样 - 使用正确的对象 如果数据不使用inetOrgPerson,则为class。所有符合LDAP的服务器都支持可扩展 匹配过滤器,但不合规的服务器可能不支持此标准过滤器。

无法使用多个基础对象,scope参数定义了多少个从属对象 在基础对象下面检查等级(如果有的话)。

另见

答案 1 :(得分:2)

您是否在manual中看到了这一点?

  

这些数组必须与链接标识符数组的大小相同,因为数组的第一个条目用于一次搜索,第二个条目用于另一个,依此类推。

基本上,您的$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);