3

Zend_Auth を使用してユーザーを認証し、その詳細をデフォルトの Zend_Auth セッションに保存します。これは、ユーザーが自分の詳細を編集しても、再認証するまでこれらの変更はアプリケーションに反映されないことを意味します。

私はこの問題を回避したい:

  1. ユーザーがログインするとuser IDZend_Authセッションにのみ保存されます
  2. リクエストごとに、セッションでのログイン時に保存された をpreDispatch()使用して、フック内のデータベースからユーザーの詳細をフェッチします。user IDZend_Auth

    class Plugin_Auth extends Zend_Controller_Plugin_Abstract
    {
    
        public function preDispatch(Zend_Controller_Request_Abstract $request)
        {
            if ($auth->hasIdentity())
            {
                $id = $auth->getIdentity()->id;
    
                $userModel = new Model_User();
    
                $user = $userModel->fetchOne($id);
    
                // Where do I store this user object ???
            }
    
        }
    }
    
  3. User問題は、このオブジェクトをどこに保存するかです。セッションの目的はデータを永続化することなので、これにはセッションを使用すべきではないと思います。ただし、リクエストごとにデータベースからデータを再フェッチするため、永続化は必要ありません。のみuser IDが永続的である必要があります。Userここでオブジェクトを保存するZend_Registryオプションはありますか?

4

3 に答える 3

1

新しい認証の詳細をZend_Authストレージ オブジェクトに書き込む方法を説明するには、次の例が最適だと思います。

$userDetails = array('foo' => 'bar');
$storage = new Zend_Auth_Storage_Session();
// set sorage for Zend_Auth
Zend_Auth::getInstance()->setStorage($storage);
// write data to the storage
Zend_Auth::getInstance()->getStorage()->write($userDetails);
// read data from storage
var_dump(Zend_Auth::getInstance()->getStorage()->read());
// edit user's data
$userDetails = array('foo' => 'bar', 'foo', 'bar');
// write new data to storage
Zend_Auth::getInstance()->getStorage()->write($userDetails);
// read new written data from storage
var_dump(Zend_Auth::getInstance()->getStorage()->read());

これは、 Zend_Authストレージを設定し、後で変更する方法を説明していると思います。

于 2012-11-28T14:05:57.740 に答える
0

Zend_Session_Namespaceオブジェクトを格納するために使用します。それはあなたが望むように一時的でも永続的でもかまいません。

Zend_Auth は、 の名前空間を使用するデフォルトのストレージ メカニズムとして、既にバックグラウンドでこれを使用していますZend_Auth

class Plugin_Auth extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $session = new Zend_Session_Namespace('user');//instantiate session namespace
        if ($auth->hasIdentity())
        {
            $id = $auth->getIdentity()->id;

            $userModel = new Model_User();

            $user = $userModel->fetchOne($id);

            $session->user = $user;//store the object can be recalled anywhere
        }
    }
}

もちろん、Zend_Registry も同様に機能します。いつものように、選択はあなた次第です。この機能を認証アダプターに組み込むのが適切である場合もあります。

于 2012-11-29T08:19:39.120 に答える
0

あなたの場合、 Zend_Registry を使用しても問題ないと思います。

于 2016-10-09T13:20:40.270 に答える