使用LDAP查找用户名

问题描述:

我维护一家大型公司的Intranet网站。由于当前的用户认证系统发生故障,我不得不制定紧急的解决方案。 下面是简化的代码使用LDAP查找用户名

$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服务器,一个页面可以获取有关此用户的用户名的信息。

而且这将是一个巨大的奖金,如果它可以给一些额外的信息,如姓名,代码分支,分支,邮件地址...等

+1

那么你将不得不要求登录凭据来启用LDAP服务器授予用户会话认证 – Suyash 2013-03-19 15:52:39

这取决于您的LDAP服务器上。如果需要验证,则必须提供该信息;但是,这应该委托给某个服务帐户,而不是绑定到特定用户(这是一个完全不同的过程)。无论如何,假设这不是问题,您可以使用ldap_search来查询LDAP服务器。

例如,如果你想搜索的cihats用户名,下设o=example DN,下面会做的伎俩:

$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输出将是为每个整个目录在搜索中找到匹配项,因此您将能够获得全名,分支代码等内容,但这些将具有特定于站点的密钥。