2011-01-12 41 views
1

我使用doctrine.I相信每一個引導正確地做,我可以登錄使用Zend_Auth的一個項目如何在使用Doctrine適配器時從Zend_Auth/Zend_ACL獲取角色? 。讓所有一起工作

我的適配器是這樣的:

class Abra_Auth_Adapter_Doctrine implements Zend_Auth_Adapter_Interface { 

protected $_resultArray; 
private $username; 
private $password; 

public function __construct($username, $password) { 

    $this->username = $username; 
    $this->password = $password; 

} 

//based on feedbacks as response authenticate has changed to this 
public function authenticate() { 
    $q = Doctrine_Query::create() 
    ->from("Abra_Model_User u") 
    ->leftJoin("u.Role r") 
    ->where("u.username=? AND u.password=?", array($this->username,$this->password)); 
    $result = $q->execute(); 
    if (count($result) == 1) { 
     return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $result->get("Mylibrary_Model_User"), array());//autoloaderNamespaces[] = "Mylibrary_" in application.ini 
    } else { 
     return new Zend_Auth_Result(Zend_Auth_Result::FAILURE, null, array("Authentication Unsuccessful")); 
    } 
} 

我Abra_Controller_Pluging_Acl長相這樣

class Abra_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract { 

public function preDispatch(Zend_Controller_Request_Abstract $request) { 
    parent::preDispatch($request); 
    $controller = $request->getControllerName(); 
    $action = $request->getActionName(); 
    $module = $request->getModuleName(); 

    $auth = Zend_Auth::getInstance(); 
    if($auth->hasIdentity()){ 
     $identity = $auth->getIdentity(); 
     $roles = $identity["Role"]; 
     $role = $roles["name"]; 
     $role = (empty ($role) || is_null($role))? "regular" : $role ; 
    } else { 
     $role = "guest"; 
    } 

} 

現在具有Doctrine_Event致命錯誤:spl_autoload()[function.spl-自動加載]:類Doctrine_Event不能加載。我已經看到這個post here,我想知道如何可以影響我使用Zend_Session,並且這是事實,我已經啓用了apc.dll在我的php.thanks大量閱讀此

回答

2

如何獲得角色:在你的適配器中,在成功登錄時,而不是僅返回用戶名字段,那麼如何返回整個用戶對象?然後,當您撥打Zend_Auth::getIdentity()時,整個事情將可用。

問題1:如果您將控制器視爲資源,並且ACL規則將隨每個模塊而不同,那麼資源名稱也應反映該模塊。這將解決具有相同控制器名稱的模塊問題。

問題2:我不確定自己的理解是否正確。 Zend_Auth及其存儲將負責在自己的會話名稱空間中保留用戶身份。但是,當db中的用戶記錄發生變化時(例如,用戶在他的登錄過程中修改了他的個人檔案中的全名),並且您在網站模板中顯示了全名,我遇到了該怎麼辦的問題,從Zend_Auth::getIdentity()提取。作爲一個用戶,我希望這個更改能夠反映在可見的界面中,但是這個更改只發生在數據庫中,而不是在會話中。

我過去所做的是創建一個額外的auth適配器,以獲取新的用戶記錄並始終返回成功。當用戶更新他的個人資料時,我使用這個微不足道的適配器撥打Zend_Auth::authenticate()。會話存儲得到更新,並且與世界一切都很好。

[這種方法幾乎肯定是一種破解,所以我會對聽取其他方法感興趣。我確信我可以直接在會話存儲中設置一個值,但是當我上次嘗試時,我無法完成它的工作。所以採取了額外的適配器解決方法。]

+0

感謝您使用寫這一切的時間。我編輯我的帖子,使問題2更清晰。 –

+0

你好我已經更新了腳本的結果和實現你的想法時發現的問題。我希望其他人可以從現在開始分享自己的經驗。無論如何感謝 –

+0

角色是一個數組? User模型是用hasMany('Role')定義的嗎?作爲一個單獨的想法,爲什麼你想要身份驗證適配器將所有內容都轉換爲數組。學說創建一個對象圖;爲什麼不保留它? –

相關問題