那麼,我發現了一種方式,突破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]');
}
這幾乎是要走的路。 Zend_Auth_ *用於AUTHENTICATION目的。檢查憑據,檢查組等,但不真正做你發現的東西。 我真的很喜歡你獲取信息的方式,對於LDAP我沒有做過很多,我覺得這很有用! – Sam
通過LDAP的工作方式,當Zend_Auth嘗試以用戶身份進行身份驗證時,它應該「綁定」該用戶的LDAP數據,並且綁定結果的一部分應該是該用戶LDAP條目的附加數據。我不應該重新綁定到該用戶才能獲取它。 – MidnightLightning
當然它翻倍,但這只是Zend_Auth的工作方式。您始終可以使用代碼擴展Zend_Auth和Zend_Auth_Adapter_Ldap以獲得結果。但據我所知,沒有內置的方法可以訪問更多。 – Sam