1

doctrine を使用するプロジェクトで 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はこのようになります

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";
    }

 }

致命的なエラー: spl_autoload() [function.spl-autoload]: クラス Doctrine_Event をロードできませんでした。この投稿をここで見たことがありますが、それが Zend_Session の使用にどのように影響するのか疑問に思っています。php で apc.dll を有効にしているのは事実です。これを読んでくれてありがとう

4

1 に答える 1

2

ロールを取得する方法: アダプターでは、ログインに成功すると、ユーザー名フィールドのみを返すのではなく、ユーザー オブジェクト全体を返すのはどうですか? を呼び出すと、すべてが利用可能になりますZend_Auth::getIdentity()

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

質問 2: 正しく理解できているかどうか自信がありません。Zend_Auth とそのストレージは、ユーザー ID を独自のセッション名前空間に保持します。ただし、データベースのユーザー レコードが変更された場合の対処方法の問題に遭遇しました。たとえば、ユーザーがログイン セッション中にプロファイルでフル ネームを変更し、サイト テンプレートにそのフル ネームを表示している場合などです。から引き出されたZend_Auth::getIdentity()。ユーザーとして、私は変更が目に見えるインターフェイスに反映されることを期待しますが、変更はセッションではなくデータベースでのみ発生しました。

私が過去に行ったことは、新しいユーザー レコードをフェッチし、常に成功を返す追加の認証アダプターを作成することです。ユーザーが自分のプロファイルを更新すると、Zend_Auth::authenticate()この簡単なアダプターを使用して呼び出します。セッション ストレージが更新され、すべてが順調に進みます。

[このアプローチはほぼ間違いなくハックであるため、別のアプローチを聞くことに興味があります。セッションストレージに値を直接設定できると確信していますが、最後に試したときはうまく機能しませんでした。そのため、追加のアダプターの回避策に頼りました。]

于 2011-01-12T02:42:14.070 に答える