Zend_Auth clearidentity和Zend_Session :: destroy导致混乱

时间:2012-02-28 10:06:13

标签: zend-framework

我有以下注销操作:

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.

我已阅读过有关此问题的问题herehere,但仍未明确我应该如何处理。我应该不使用Zend_Session :: destroy()吗?不使用它的含义和危险是什么,替代方案是什么?

2 个答案:

答案 0 :(得分:2)

导致问题的原因是,在销毁会话后,您正在重复使用它(通过促进FlashMessenger。如果在注销困扰您之后不会破坏会话,您可以显示注销页面而不是重定向到您的首页flash消息。

在用户注销后保留部分会话数据可能会产生安全隐患,但这取决于您在会话中存储的内容以及您在何处以及如何使用数据。为了确保您不保留属于会话中登录用户的数据,只需使用特定会话命名空间来获取此数据,并在注销时调用unsetNamespace()

答案 1 :(得分:1)

Zend_Auth有自己的会话命名空间,在Zend_Auth::getInstance()->clearIdentity();之后删除它,所以如果你使用它们就不需要销毁所有会话空间。

示例发生了什么:

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