我为一家大公司维护一个内部网站点。由于当前用户认证系统失败,我不得不开发一个紧急的解决方案。 这是简化的代码
$usr=$_POST['user'];
$psw=$_POST['code'];
if(!strlen($psw) )
$psw="x";
// because empty password works fine for any user
$ldap= ldap_connect("LDAP://ldapserver.xxx.local");
if(!$ldap)
exit(0);
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_OPT_REFERRALS, 0);
if($bind = @ldap_bind($ldap, $usr, $psw){
header("Location: http:10.xx.xx.xx/entrance.php?id=$usr");
// login OK, look for user privileges
}else{
header("Location: http:10.xx.xx.xx/login.php?INV=1");
// back to login page
}
代码工作得很好,但我不希望用户输入他们的网络用户名和密码, 当用户访问此页面时,匿名连接并绑定到LDAP服务器,页面可以获取有关该用户的用户名的信息。
如果可以提供一些额外的信息,如全名,分行代码,分支机构,邮件地址等等,这将是一个很大的好处。
答案 0 :(得分:0)
这取决于您的LDAP服务器。如果需要身份验证,则必须提供该信息;但是,这应该委托给某个服务帐户,而不是绑定到特定用户(这是一个完全不同的过程)。无论如何,假设这不是问题,您可以使用ldap_search
查询LDAP服务器。
例如,如果您想在cihats
DN下搜索o=example
的用户名,则可以采用以下方法:
$ldap = @ldap_connect($yourHostname);
$query = @ldap_search($ldap, 'o=example', 'cn=cihats');
$results = @ldap_get_entries($ldap, $query);
if ($results['count']) {
print_r($results);
} else {
echo "No such common name";
}
ldap_get_entries
的输出将是搜索中找到的每个匹配项的整个目录,因此您将能够获得全名,分支代码等内容,但这些内容将包含站点特定的密钥。