Обновление хранилища Zend_Auth после редактирования пользователя

Я использую Zend_Auth для аутентификации пользователей, а затем сохраняю их данные в сеансе Zend_Auth по умолчанию. Это означает, что когда пользователь редактирует свои данные, эти изменения не будут отражены в приложении, пока он не пройдет повторную аутентификацию.

Я хочу избежать этой проблемы так:

  1. Когда пользователь входит в систему, мы сохраняем только его user ID в Zend_Auth сеансе.
  2. По каждому запросу мы извлекаем данные пользователя из базы данных в ловушке preDispatch(), используя user ID, который был сохранен при входе в систему в сеансе Zend_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?


person Freek Vanraes    schedule 28.11.2012    source источник
comment
Было бы нецелесообразно делать повторную аутентификацию частью изменения профиля пользователя. В конце концов, вам нужно убедиться, что пользователь на самом деле является пользователем. Какое прекрасное время для повторной аутентификации и обновления хранилища.   -  person RockyFord    schedule 29.11.2012


Ответы (3)


Используйте 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 также будет работать, и, как всегда, выбор за вами. Возможно, вы даже сочтете целесообразным встроить эту функцию в свой адаптер аутентификации.

person RockyFord    schedule 29.11.2012

Я думаю, что пример лучше всего объясняет, как записать новые данные аутентификации в объект хранилища 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 и изменить его позже.

person Bartosz Grzybowski    schedule 28.11.2012
comment
Вы только что описали, как добавить данные в механизм хранения Zend_Auth сеанса по умолчанию. Я уже знаю, как это делать. Сохраняя все данные пользователя в сеансе, изменения этих данных будут отражены только при повторной аутентификации пользователя. - person Freek Vanraes; 29.11.2012
comment
Вы отредактировали вопрос. Anywho ПОЧЕМУ Вы не будете хранить объект пользователя в сеансе (может быть как массив) и переписывать его только тогда, когда пользователь редактирует свои данные, не получая данные пользователя по каждому запросу? Если этот вариант вам не подходит. Вы всегда можете иметь метод в своей User_Model с именем getCurrentUser со статическим полем $ user и всегда получать данные пользователя из этого метода, когда запрос будет выполнен один раз. - person Bartosz Grzybowski; 29.11.2012

Я считаю, что использование Zend_Registry в вашем случае нормально.

person Max Chernopolsky    schedule 09.10.2016