2010-05-28 3 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

$ 필터 = "(SAMAccountName을 : 의이 $link가 당신은 이런 것을 확인할 수 있습니다 ldap_connect() ldap_get_entries ($ 링크, $ 결과)로 만든 LDAP 데이터베이스에 귀하의 링크입니다 가정 해 봅시다 = $ username) "; <-이게 맞습니까? "samaccountname"은 고유 한 사용자 이름입니다. – horgen

답변

4

sAMAccountName은 Active Directory에서 사용되는 사용자 이름 속성이므로 은 정확한 사용자 이름 (%s은 자연스럽게 사용자 이름으로 바뀜)에 대해 LDAP을 검사하는 올바른 필터가됩니다.

당신이 잘못된 필터 또는 최악의 악성 LDAP 주사를 피하기 위해 $username에 특수 문자를 처리 할 필요가 있음을 양해하여 주시기 바랍니다 (참조 RFC 2254) : ACII 코드

모든 제어 문자 < (32) LDAP 필터에서 특별한 의미를 갖는 문자 "*", "(", ")"및 "\"(백 슬래시) 은 백 슬래시의 표현 다음에 두 개의 16 진수 을 나타내는 숫자로 변환됩니다 헥사 데시 mal 문자의 값입니다.

3

ldap_search() 모두 해당 항목을 찾으면 결과를 확인해야합니다.

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

또는

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