Zend_Auth存储如何工作?

时间:2009-09-17 11:32:26

标签: zend-framework storage zend-auth

这很简单。我写了

$auth->getStorage()->write($user);

然后我想在一个单独的进程中加载​​这个$ user,但我不能因为

$user = $auth->getIdentity();

是空的。我不是只是......设定它?为什么不起作用? HALP?

[编辑2011-04-13]

大约两年前就已经提出这个问题了。但事实是,我在2010年7月重复了这个问题并得到了一个很棒的答案,我当时根本不明白。

链接:Zend_Auth fails to write to storage

我已经构建了一个非常好的litte类,我使用与Zend_Auth相同的存储引擎在所有项目中使用(有时需要额外调整)但是绕过所有坏处。

<?php

class Qapacity_Helpers_Storage {

    public function save($name = 'default', $data) {

        $session = new Zend_Session_Namespace($name);
        $session->data = $data;

        return true;
    }

    public function load($name = 'default', $part = null) {

        $session = new Zend_Session_Namespace($name);

        if (!isset($session->data))
            return null;

        $data = $session->data;

        if ($part && isset($data[$part]))
            return $data[$part];

        return $data;
    }

    public function clear($name = 'default') {

        $session = new Zend_Session_Namespace($name);

        if (isset($session->data))
            unset($session->data);

        return true;
    }

}

?>

3 个答案:

答案 0 :(得分:1)

它应该有用。

以下是Auth getIdentity函数的实现。

/**
 * Returns the identity from storage or null if no identity is available
 *
 * @return mixed|null
 */
public function getIdentity()
{
    $storage = $this->getStorage();

    if ($storage->isEmpty()) {
        return null;
    }

    return $storage->read();
}

以下是PHP Session Storage写入和读取功能的实现:

/**
 * Defined by Zend_Auth_Storage_Interface
 *
 * @return mixed
 */
public function read()
{
    return $this->_session->{$this->_member};
}

/**
 * Defined by Zend_Auth_Storage_Interface
 *
 * @param  mixed $contents
 * @return void
 */
public function write($contents)
{
    $this->_session->{$this->_member} = $contents;
}

您确定要加载Zend_Auth类的相同实例吗?

您使用的是

吗?
$auth = Zend_Auth::getInstance();

也许你在getIdentity方法之后调用write方法?

无论如何,正如我之前所说,你正在做的事情应该有用。

答案 1 :(得分:0)

因此,在页面重新加载时,您可以获取会话,而不是重定向?您是否在不同的域名上重定向?然后它可能是Cookie的问题,您需要手动设置session.cookie_domain ini变量。

检查名为PHPSESSID的cookie是否已正确设置,以及是否在每次页面请求时将其发送到服务器?它是不变的还是每次请求都会改变?

此外,您可能想要检查会话数据是否正确保存到磁盘。会话可以在ini变量session.save_path定义的目录中找到。该文件是否与您的PHPSESSID对应,是否包含有意义的条目?在我的情况下它包含

root@ip-10-226-50-144:~# less /var/lib/php5/sess_081fee38856c59a563cc320899f6021f 
foo_auth|a:1:{s:7:"storage";a:1:{s:9:"user_id";s:2:"77";}}

答案 2 :(得分:0)

添加:

register_shutdown_function('session_write_close');

到index.php之前:

$application->bootstrap()->run();