使用PHP在LDAP中的更多OU中搜索用户

时间:2013-01-16 13:36:42

标签: php ldap

我的任务是最终实现一个单点登录解决方案,使用存储在其工作机器中的AD凭据将用户登录到我的系统。我正在使用ldap_ functions in PHP

我遇到的问题是我必须检查多个OU的凭据(目前大约30个),而且我还没有找到从AD系统获取这些OU的方法,所以我有一个很大的OU的数组作为一种权宜之计。我用ADexplorer获得了这个列表。有没有办法用PHP做到这一点?

我的第一语言不是英语,所以我让阿德里亚诺为我翻译这个,而且我在理解文档方面也遇到了问题。

在这个阶段,我基本上是从the ldap_search manpage中的示例中复制此代码:

<?php
$ds=ldap_connect($ldapserver);

// 42 OUs in our case
$dn[]='OU=ABC,DC=xyz,DC=ac,DC=uk';
$dn[]='OU=DEF,DC=xyz,DC=ac,DC=uk';
// ...

$totalDns = count($dn);
for ($i = 0; $i < $totalDns; $i++) {
    $id[] = $ds;
}

$filter = 'samaccountname='.$_POST['username'];

$result = ldap_search($id,$dn,$filter);

$search = false;

foreach ($result as $value) {
    if(ldap_count_entries($ds,$value)>0){
        $search = $value;
        break;
    }
}

if($search){
    $info = ldap_get_entries($ds, $search);
}else{
    $info = 'No results found';
}

更新

我尝试了Vladislav Ross建议的解决方案,几秒钟后,服务器吐了这个:

mod_fcgid: stderr: PHP Warning:  ldap_search() [<a href='function.ldap-search'>function.ldap-search</a>]: Search: Can't contact LDAP server in ... on line 28

如果我将特定OU添加到同一搜索中,则不会发生这种情况。 I.E.如果我做

$sr = ldap_search(
     $ds,
     "OU=Usuarios,dc=test,dc=com",
     "ObjectClass=organizationalUnit",
     array("")
);

而不是

$sr = ldap_search(
      $ds,
      "dc=test,dc=com",
      "ObjectClass=organizationalUnit",
      array("")
);

我的确得到了正确的结果。我尝试将timelimit和sizelimit参数设置为0,但结果相同。我现在正在咨询服务器人员,了解他们的限制。

3 个答案:

答案 0 :(得分:2)

尝试将ldap_search与过滤器ObjectClass = organizationalUnit:

一起使用
    $ds = ldap_connect($AD_server);
    if(!$ds) die("cannot connect to LDAP server at $AD_server.");

    $r = ldap_bind($ds, $AD_Auth_User, $AD_Auth_PWD);
    if(!$r)
    {
        ldap_get_option($ds,LDAP_OPT_ERROR_STRING,$error);
        die("cannot bind to LDAP server at $AD_server ($error).");
    };

    $sr=ldap_search($ds,"dc=test,dc=com","ObjectClass=organizationalUnit",array(""));
    $info = ldap_get_entries($ds, $sr);

    print_r($info); //<--array with OU's you need

如果您不需要递归搜索,请使用ldap_list而不是ldap_search。

答案 1 :(得分:1)

听起来您想要对域中的任何用户进行身份验证。不要搜索多个DN,只需从域的根目录搜索一次。因此,不要使用'OU=ABC,DC=xyz,DC=ac,DC=uk',而是使用'DC=xyz,DC=ac,DC=uk'

答案 2 :(得分:1)

  

我还没有找到从AD系统获取这些OU的方法

上面的示例表明这些OU是 直接 DC = xyz,DC = ac,DC = uk的子项?如果是这样,找到这些的最有效的LDAP搜索是:

  • 搜索基础:DC = xyz,DC = ac,DC = uk
  • 搜索范围:一级&lt; - 直接 搜索基础的子女
  • 搜索过滤器:(objectclass = organizationalUnit)

使用相应的ldapsearch命令行测试......

ldapsearch -h <hostname> -s onelevel -b "DC=xyz,DC=ac,DC=uk" "(objectclass=organizationalUnit)"