我正在尝试验证用户'登录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.";
}
}}
?>
答案 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环境的结构。吸取了大量教训。