2012-02-28 5 views
1

У меня есть следующие действия: выход из системыZend_Auth clearidentity и Zend_Session :: уничтожить вызывает путаницу

public function logoutAction() { 
      Zend_Auth::getInstance()->clearIdentity(); 
      Zend_Session::destroy(); 

      $this->_helper->flashMessenger->addMessage(array('success' => 
       _('You were successfully logged out.'))); 
      $this->_redirect('/index/index'); 
     } 

Если я не закомментировать строку: Zend_Session :: Destroy(), я получаю ошибку:

Fatal error: Uncaught exception 'Zend_Session_Exception' with message 'The session was explicitly destroyed during this request, attempting to re-start is not allowed.' in /usr/local/share/php/library/Zend/Controller/Plugin/Broker.php on line 336 Zend_Session_Exception: The session was explicitly destroyed during this request, attempting to re-start is not allowed. 

Я прочитал об этом выпуске here и here, но остаюсь неясным, как я должен действовать. Должен ли я просто не использовать Zend_Session :: destroy()? Каковы были бы последствия и опасности не использовать его, и какова альтернатива?

ответ

2

Что вызывает проблемы в том, что сразу после уничтожения сессии, вы многократно использовать его (путем содействия FlashMessenger Если не разрушив сеанс после выхода из системы надоедает, вы может отображать страницу выхода из системы, а не перенаправлять на вашу главную страницу с помощью флэш-сообщения.

Оставив некоторые данные вашего сеанса без изменений после выхода пользователя из системы, могут иметь последствия для безопасности, но это зависит от того, что вы храните в своей сессии, и где и как вы используете данные. Чтобы убедиться, что вы не храните данные, в принадлежащем зарегистрированному пользователю на вашем сеансе, просто используйте определенное пространство имен для этих данных и вызовите unsetNamespace() при выходе из системы.

+0

Спасибо, я могу жить без вызова флеш-мессенджера. – dimbo

1

У Zend_Auth есть собственное пространство имен сеансов, и после Zend_Auth::getInstance()->clearIdentity(); оно удаляет его, поэтому нет необходимости уничтожать все сеансовые nemaspaces, если вы их используете.

Пример того, что здесь происходит:.

// logging user 
$_SESSION['Zend_Auth'] = 'logged user data'; 
// after Zend_Auth::getInstance()->clearIdentity(); 
$_SESSION['Zend_Auth'] = null; 
// after Zend_Session::destroy(); 
session_destroy();