2011-09-19 5 views
1

Zend_Auth 모듈에 대해 Zend Framework LDAP adapter을 성공적으로 구현했으며 내 Active Directory 컨트롤러에 로그인 할 수 있습니다. 그러나 getIdentity() 메서드는 웹 페이지 자체에 표시 할 사용자 개체의 "cn"또는 "displayname"속성을 (추가로) 가져 오는 동안 사용자 이름 (데이터베이스 외래 키 사용에 유리함) 만 반환합니다.Zend LDAP 인증의 표시 이름 가져 오기

Zend_Auth_Adapter_Ldap 개체에서는 getLdap() 메서드가 표시되지만 결과 개체는 Zend_Auth로부터 인증되지 않습니다. LDAP 연결에서 사용자가 인증을 받고 데이터를 가져 오는 방법이 있습니까?

답변

1

글쎄, Zend_Auth 모듈을 깨고 Zend_Ldap 모듈을 직접 사용하는 방법을 발견했습니다. 누구나 Auth 또는 AuthAdapter 객체를 사용하여이를 수행하는 방법을 알고 있다면 기꺼이 배울 수 있습니다!

로그인 기능 :

$authAdapter = new Zend_Auth_Adapter_Ldap(array(
    'server1' => array(
     'host' => Zend_Registry::get('LDAP_host'), 
     'accountDomainName' => Zend_Registry::get('LDAP_domainName'), 
     'accountCanonicalForm' => 2, 
     'baseDn' => Zend_Registry::get('LDAP_baseDn'), 
     'bindRequiresDn' => TRUE, 
    ) 
)); 
$authAdapter->setIdentity($_POST['username']); 
$authAdapter->setCredential($_POST['passwd']); 
$auth = Zend_Auth::getInstance(); 

// Do the login 
$rs = $auth->authenticate($authAdapter); 
if (!$rs->isValid()) { 
    // Login failed 
    exit; 
} 
// Login succeeded 

는 인증 된 사용자에 대한 확인 : 우리는 현재 인증 된 경우 Zend_Ldap을 만들어 다양한 LDAP 옵션을 저장하고 현재 사용자 정보에 Zend_Registry를 사용하고

AuthAdapter와 유사한 옵션을 사용하는 객체를 찾고이 사용자 ID를 검색하십시오.

$auth = Zend_Auth::getInstance(); 
if ($auth->hasIdentity()) { 
    $uid = $auth->getIdentity(); 
    Zend_Registry::set('cur_user', $uid); // Save username 
    $ldap = new Zend_Ldap(array(
     'host' => Zend_Registry::get('LDAP_host'), 
     'accountDomainName' => Zend_Registry::get('LDAP_domainName'), 
     'accountCanonicalForm' => 2, 
     'baseDn' => Zend_Registry::get('LDAP_baseDn'), 
     'bindRequiresDn' => TRUE, 
    )); 
    $ldap->bind(); 
    $rs = $ldap->getEntry('uid='.$uid.','.Zend_Registry::get('LDAP_baseDn'), array('displayname', 'mail')); 
    Zend_Registry::set('cur_user_name', $rs['displayname'][0]); 
    Zend_Registry::set('cur_user_mail', $rs['mail'][0]); 
} else { 
    Zend_Registry::set('cur_user', 'Anonymous'); 
    Zend_Registry::set('cur_user_name', 'Anonymous'); 
    Zend_Registry::set('cur_user_mail', '[email protected]'); 
} 
+0

이것은 거의가는 길입니다. AUTHENTICATION 목적을위한 Zend_Auth_ * ist. 자격 증명을 확인하고, 그룹을 확인하지만 등등. 당신이 발견 한 것을 실제로하지 마십시오. 정보를 얻는 방법이 정말 좋고, LDAP로 많은 일을하지 못했습니다. 매우 유용하다고 생각합니다! – Sam

+0

LDAP 작동 방식에서 Zend_Auth가 사용자로 인증을 시도 할 때 LDAP의 해당 사용자 데이터에 "바인딩"되어야하며 해당 바인딩 결과의 일부는 해당 사용자의 LDAP 항목에있는 추가 데이터 여야합니다. 나는 그 사용자를 가져 오기 위해 그 사용자에게 재 바인딩 할 필요가 없다. – MidnightLightning

+0

물론 두 배가되지만 Zend_Auth가 작동하는 방식 일뿐입니다. 언제든지 Zend_Auth 및 Zend_Auth_Adapter_Ldap을 코드로 확장하여 결과를 얻을 수 있습니다. 그러나 내 지식으로는 더 많은 정보에 접근 할 수있는 방법이 없습니다. – Sam

0

Zend_Auth_Adapter_Ldap은 당신이 원하는 것을 할 것입니다 방법 getAccountObject을 정의합니다.

;

$adapter = new Zend_Auth_Adapter_Ldap($options, $username, $password); 

$result = $auth->authenticate($adapter); 

if ($result->isValid()) { 
    $user_data = $adapter->getAccountObject(); 
} 

이 방법을 사용하면 검색 할 속성도 선택적으로 설정할 수 있습니다.