Zend_Auth - когда я устанавливаю собственное пространство имен хранилища, оно не существует, когда я перенаправляю на новый контроллер

В моем entry Контроллер, который я установил:

Это работает:

$authadapter = new Test_Auth_Adapter_DbTable($db);
$auth = Zend_Auth::getInstance();

$result = $auth->authenticate($authadapter);
$data = $authadapter->getResultRowObject(null, 'password');
$auth->getStorage()->write($data);
$this->_redirector->gotoUrl('/main');

Это не:

$authadapter = new Test_Auth_Adapter_DbTable($db);
$auth = Zend_Auth::getInstance();

$auth->setStorage(new Zend_Auth_Storage_Session('Test_User')); //the only difference

$result = $auth->authenticate($authadapter);
$data = $authadapter->getResultRowObject(null, 'password');
$auth->getStorage()->write($data);
$this->_redirector->gotoUrl('/main');

Я вижу, что он установлен в переменной $_SESSION со всеми правильными данными, когда я использую отладчик, но после того, как данные настроены, и я перенаправляю в нужное место назначения, переменная $_SESSION больше не устанавливается, поэтому я не могу получить доступ к вещам!

Страница перенаправляется на проверку аутентификации с помощью:

$this->auth = Zend_Auth::getInstance();
        if (!$this->auth->hasIdentity()) {
            $this->_redirector->gotoUrl('/entry');
        }

Почему это не работает?

1 ответ

Решение

Попробуй это:

$this->auth = Zend_Auth::getInstance();
$this->auth->setStorage(new Zend_Auth_Storage_Session('Test_User'));
if (!$this->auth->hasIdentity()) {
    $this->_redirector->gotoUrl('/entry');
}

проблема в том, что если вы не установите класс хранилища, он по умолчанию будет использовать Zend_Auth_Storage_Session с пространством имен Zend_Auth. А поскольку данные вашего сеанса не находятся в этом пространстве имен, Zend_Auth не видит их и ведет себя так, как будто пользователь не вошел в систему.

В зависимости от того, как структурировано ваше приложение (и насколько большой его частью является аутентификация), вы можете захотеть сделать это в методе начальной загрузки, поэтому вам придется сделать это только один раз:

protected function _initAuth()
{
    $auth = Zend_Auth::getInstance();
    $auth->setStorage(new Zend_Auth_Storage_Session('Test_User'));

    return $auth;
}
Другие вопросы по тегам