2011-01-12 4 views
1

をすべての作業を取得し、すべてのブートストラップが正しく行われていると私は、ログインすることができます信じているDoctrineアダプタを使用する場合のZend_Auth/Zend_ACLからの役割の取得方法は?私はdoctrine.Iを使用してプロジェクトににZend_Authを使用しています一緒に

私のアダプタは次のようになります。

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のルックスspl_autoload()[function.spl-のautoload]:今Doctrine_Eventは致命的なエラーを持つこの

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はロードできませんでした。私はこれを見たpost hereと私はZend_Sessionの私の使用に影響を与えることができ、それは私のphp.thanksでこれを読むために多くを有効にしていることを真実だと思っています

答えて

2

どのように役割を取得する:あなたのアダプタでは、ユーザー名フィールドだけを返すのではなく、ログインに成功した場合、ユーザーオブジェクト全体を返すのはどうですか? Zend_Auth::getIdentity()に電話すると、そのすべてが利用可能になります。

質問1:コントローラをリソースとして扱い、ACLルールがモジュールごとに異なる場合、リソース名にもモジュールが反映されている必要があります。これは、同じコントローラ名を持つモジュールの問題に対処します。

質問2:正しく理解しているかどうかわかりません。 Zend_Authとそのストレージは、独自のセッション名前空間にuerのIDを保持します。しかし、私はdbのユーザーレコードが変更されたときに何をすべきかという問題にぶち当たっています。たとえば、ログインしているセッション中にユーザーが自分のフルネームを自分のプロファイルに変更し、そのフルネームをサイトテンプレートZend_Auth::getIdentity()から引き出されました。ユーザーとして、私は変更が表示されたインターフェイスに反映されることを期待しますが、変更はセッションではなくdbでのみ発生しています。

私が過去に行ったことは、新しいユーザーレコードを取得し、常に成功を返す追加の認証アダプタを作成することです。ユーザーがプロフィールを更新すると、私はZend_Auth::authenticate()にこの簡単なアダプタを使用して呼び出します。セッションの記憶域が更新され、すべてが世界に適しています。

[このアプローチはほぼ確実にハックですので、私は代替アプローチを聞くことに興味があります。私はセッション記憶域に直接値を設定できると確信していますが、最後に試してみるとかなりうまくいくことはできませんでした。だから、追加のアダプタの回避策に頼っています。]

+0

私はこのすべてを書くのに感謝しています。 –

+0

こんにちは私はあなたのアイデアを実装したときに見つかった結果と問題でスクリプトを更新しました。他の人が今から踏み込んで自分のexperience.thanksを共有できることを願っています –

+0

役割は配列ですか?ユーザーモデルはhasMany( 'Role')で定義されていますか?別の考えとして、authアダプターがすべてを配列に変換する理由を教えてください。 Doctrineはオブジェクトグラフを作成します。なぜそれを保つのですか? –