2013-03-19 59 views
1

我維護一家大型公司的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

回答

0

這取決於您的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輸出將是爲每個整個目錄在搜索中找到匹配項,因此您將能夠獲得全名,分支代碼等內容,但這些將具有特定於站點的密鑰。