2010-05-28 55 views
3

$ _SERVER ['REMOTE_USER']返回登錄到Active Directory的用戶的用戶名。我想通過使用ldap_search()來檢索這個用戶信息。PHP - ldap_search()過濾器。如何搜索用戶

這是我現在有:

$ad = // ldap_connection id 
$filter = "(|(sn=$username*)(givenname=$username*))"; 
$attr = array("displayname", "mail", "mobile", "homephone", "telephonenumber", "streetaddress", "postalcode", "physicaldeliveryofficename", "l"); 
$dn = // OU, DC etc.. 

ldap_search($ad,$dn,$filter,$attr); 

它的工作原理,但我不知道,如果兩個用戶幾乎具有相同的名稱,將工作。 我如何只搜索他們的唯一用戶名,以便我只能得到一個用戶?

+0

$過濾器=「(SAM帳戶= $用戶名)「; < - 這是正確的嗎? 「samaccountname」是唯一的用戶名權限? – horgen 2010-05-28 07:33:32

回答

4

sAMAccountName在Active Directory中使用的用戶名,屬性,所以(&(objectClass=user)(sAMAccountName=%s))會(通過實際的用戶名被自然替換%s)正確的過濾器來檢查給定用戶名的LDAP。

請注意,你需要處理特殊字符在$username避免畸形的過濾器或在最壞的惡意LDAP注射(見RFC 2254):

與ACII 代碼的任何控制字符< 32以及字符 與LDAP過濾器 特殊含義「*」,「(」,「)」,和「\」(反斜線) 被轉換成反斜線的表示 隨後是代表兩個十六進制 數字十六進制mal 字符的值。

3

ldap_search()會找到所有匹配的條目,您將不得不驗證結果。 假設$link是你的鏈接到與ldap_connect() ldap_get_entries($連接,$結果)創建的LDAP數據庫 您可以驗證這樣的:

$result = ldap_search(); 
if(ldap_count_entries($link, $result) === 1) { 
    ... 
} 

$result = ldap_search(); 
$entries = ldap_get_entries($link, $result); 
if(sizeof($entries) === 1) { 
    ... 
}