2011-09-19 117 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對象來做到這一點,我很樂意學習!

我使用Zend_Registry存儲各種LDAP選項,然後將當前用戶的信息:

登錄功能:

$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對象使用與AuthAdapter類似的選項,並搜索此用戶標識。

$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

這幾乎是要走的路。 Zend_Auth_ *用於AUTHENTICATION目的。檢查憑據,檢查組等,但不真正做你發現的東西。 我真的很喜歡你獲取信息的方式,對於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(); 
} 

的方法可以讓你隨意設置哪些屬性要檢索了。