2

状況があります:いくつかの構造化データ(たとえば、配列やオブジェクト、さらには文字列)をZend_AuthIDとして保存します。バージョンごとにIDの構造を変更できるため、あるバージョンのIDは、別のバージョンのアプリケーションコードと互換性がある(または互換性がない)可能性があります。

保存されたIDデータが現在のバージョン要件に準拠しているかどうかを検証する機能が必要です。

マニュアルからわかるように、IDが存在するかどうかの検証は次のように実行されます。

$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
    // Identity exists; get it
    $identity = $auth->getIdentity();
}

hasIdentity()ただし、検証を実行するためにメソッドまたは他の場所にフックする機能はありません。

私がそれを行う唯一の方法は、実装Zend_Auth_Storage_Interfaceとして他のストレージを使用し、保存されたデータの検証を実行する独自のクラスを実装することです。

これ以上適切な解決策はありますか?

4

2 に答える 2

2

完全に理解できるかどうかはわかりませんが、承認と認証の違いを誤解しているようです。

Zend_Authは認証に関するものであるため、 Zend_Authを使用して承認を処理するのではなく、Zend_Aclを使用する必要があります。

ただし、認証プロセス(つまり、データベース認証)からの追加情報を保存getResultRowObject($returnColumns, $ommitColumns);する必要がある場合は、この方法を使用できます。

現在のアダプタに応じて、「行オブジェクト」を取得するためのいくつかの実装があります。

Zend_Auth_Storage_Interface結果を保存することです。たとえば、セッションやデータベースにIDオブジェクトを保存することなので、このような実装を行う必要はないと思います。

必要なのは、Zend_Aclを使用して、ロールユーザーの場合もあります)、リソースバージョン管理されたアプリケーション)、特権使用できるかどうか)を一般的に定義するアクセス制御リストを作成することです。


注: *ほとんどの人は、モジュール/コントローラー/アクションで考えるため、Zend_Aclを使用するのが困難ですが、これはリソースを定義する1つの方法にすぎません。
リソースには、アプリケーション全体、コントローラーアクション、ビュー、別のユーザー、データベース接続など、必要なものを指定できます。*

于 2011-03-12T13:14:36.210 に答える
0

上記の答えを受け入れたとしても、何か他のものが必要だと思います。

$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
    // Identity exists - validate if it's valid

    $identity = $auth->getIdentity();
    if (!HelperClass::validateIdentity($identity)) { //you validation method
         /* User has stored identity from previous version. 
          * It may miss some important info (like a role value
          * you added recently). Clear it and require re-login. */
         $auth->clearIdentity();
         $this->_helper->flashMessenger('Please login ...');
         $this->_helper->redirector('login');
    }
    // identity is valid
    $acl = Acl::factory(); //get acl object somehow
    if (!$acl->isAllowed($module.$controller.$action, $identity->role)) {
         throw new AccessDeniedException();
    }
    // else nothing -> user has valid session data and is allowed to access the resource. 
}
于 2011-03-12T15:42:19.220 に答える