PHP ldap_get_entries()返回count = 0

时间:2016-09-07 12:35:32

标签: php authentication login ldap

我正在尝试验证用户'登录LDAP(服务器是Mac El Capitan)。
我可以成功连接并绑定到ldap服务器。
我可以搜索和排序结果。
但是当我表演" ldap_get_entries"时,我收到了#34;零"条目。 我已经尝试了从StackOverFlow到Google的第二页的所有内容。
任何建议或想法为什么会发生这种情况?


我的代码 -

    <?php
    session_start(); // Starting Session
    $error=''; // Variable To Store Error Message
    if (isset($_POST['submit'])) {
    if (empty($_POST['email']) || empty($_POST['password'])) {
    $error = "Username or Password is invalid";
    }
    else
    {
    $usernameLogin=$_POST['email'];
    $passwordLogin=$_POST['password'];
    $username  = stripslashes($usernameLogin);
    $password  = stripslashes($passwordLogin);
    echo "User name is ".$username;
    echo "</br>";
    $ldapUser  = "uid=xxxxxx,cn=users,dc=dns1,dc=xxxxxxxx,dc=com";
    $ldapPass  = "xxxxxxxxxxx";
    $url       = "ldap://dns1.xxxxxxx.com:389";
    $ldap      = ldap_connect("$url") or die("Could not connect to LDAP server.");
    $baseDN    = "cn=users,dc=dns1,dc=xxxxxxxxx,dc=com";      
    ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldap, LDAP_OPT_REFERRALS,0);
    $bind      = ldap_bind($ldap, $ldapUser, $ldapPass);

    if($bind) {
        echo "Connected To LDAP";
        echo "</br>";
        $filter="(sAMAccountName=$username)";
        echo "Filter = ".$filter;
        echo "</br>";
        $result = ldap_search($ldap,$baseDN,$filter) or die("Could not search.");
        echo "Result = ".$result;
        echo "</br>";
        $sort = ldap_sort($ldap,$result,"uid");
        echo "Sort = ".$sort;
        echo "</br>";
        $number = ldap_count_entries($ldap, $result);
        echo "Count Entries = ".$number;
        echo "</br>";
        $info = ldap_get_entries($ldap, $result);
        echo "Data for " . $info["count"] . " items returned:<p>";
        echo "Info = ".$info;
        echo "</br>";
        echo '<pre>'; print_r($info); echo '</pre>';
        echo "</br>";
        $fentry= ldap_first_entry($ldap, $result);
        echo "First Entry = ".$fentry;

         for ($i=0; $i<$info["count"]; $i++)
            {
                if($info['count'] > 1)
                    break;
                echo "<p>You are accessing <strong> ". $info[$i]["sn"][0] .", " . $info[$i]["givenname"][0] ."</strong><br /> (" . $info[$i]["samaccountname"][0] .")</p>\n";
                echo '<pre>';
                var_dump($info);
                echo '</pre>';
                $userDn = $info[$i]["distinguishedname"][0]; 
            }

        ldap_close($ldap);

    }
    else{
        echo "Cannot Connect To LDAP.";
    }


    }}
    ?>

Echo Results On Browser.
我可以连接 - bind - search但是&#34; ldap_get_entries()&#34;返回零。

2 个答案:

答案 0 :(得分:1)

首先:您可以跳过or die "Could not connect to LDAP Server",因为这几乎不会发生。 ldap_connect仅检查参数的语法正确性,实际连接到服务器。实际连接发生在第一次调用服务器时,通常是ldap_bind。这就是为什么conncetion问题经常出现在ldap_bind而不是ldap_connect上。

第二:你从哪里得到samAccountName?这是ActiveDirectory通常使用的字段。在Apples OpenDirectory中,用户通常由uid - 属性标识。因此,您的过滤器应为sprintf('uid=%s', $username)

第三:我怀疑只允许“Open Directory管理员”组中的用户再次绑定 LDAP。他们肯定是唯一允许编辑目录的人,但其他每个用户也可以绑定

第四:ldap_sort现在已被弃用。它不是在服务器端排序,而是在客户端排序。因此,只对返回的结果进行排序。如果您有分页结果意味着 - 即使您对结果进行了排序 - 仍然会有适合您的结果的条目。我目前正在研究一种使用服务器端排序的方法,但这取决于服务器上可用的功能。所以你可以使用ldap_sort,但你也可以在结果集上实现自己的排序。

因此,将过滤器更改为uid=$username,您将获得预期的结果。 mail属性可能还包含完整的电子邮件地址,因此可能会失败!您还可以调整过滤器以搜索多个字段。有关简短示例,请查看this slide

答案 1 :(得分:0)

解决了它。我使用“mail”而不是“sAMAccountName”。
这是详细信息 -

1)来自

    $filter="(sAMAccountName=$username)";

    $filter="(mail=$username)";

2)来自

     $sort = ldap_sort($ldap,$result,"uid");

    $sort = ldap_sort($ldap,$result,"mail");

就是这样。

经验教训 -


 在跳转到编码之前,使用“LDAP管理工具”或某种LDAP工具来了解LDAP环境的结构。吸取了大量教训。