2010-10-04 1 views
1

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

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

$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 var больше не является s и поэтому я не могу получить доступ к вещам!

страница перенаправлены на чеки AUTH с:

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

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

ответ

4

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

$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 не видит его и ведет себя так, как будто пользователь не вошел в систему.

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

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

    return $auth; 
} 
+1

Это было сделано. Я предположил, что вызов setStorage() в действии контроллера логина подскажет ZF, что это конкретное пространство имен было тем, что существовало. Я не понимал, что должен был сказать это, чтобы написать его, а затем вручную сообщить об этом, чтобы проверить его (так как это автоматически с Zend_Auth, я предположил, что он был автоматическим с любым пространством имен, которое было установлено). – Lothar

+0

В случае, когда мы устанавливаем его в bootstrap, как мы можем использовать это хранилище в контроллере для '$ authStorage = $ auth-> getStorage(); $ authStorage-> write ($ identity);'. пожалуйста, направляйте –

 Смежные вопросы

  • Нет связанных вопросов^_^