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

В моем 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 var со всеми правильными данными, когда я использую отладчик, но после того, как данные заданы и я перенаправляю в нужное место назначения, переменная $ _SESSION больше не устанавливается, поэтому я не могу получить доступ к вещам!

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

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

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

1 Ответ

4 голосов
/ 05 октября 2010

Попробуйте:

$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;
}
...