2009-09-17 74 views
5

这很简单。我写Zend_Auth存储如何工作?

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

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

$user = $auth->getIdentity(); 

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

[编辑2011-04-13]

这已问了近两年前。事实是,我在2010年7月重复了这个问题,并得到了一个很好的答案,我当时根本不明白。

链接:Zend_Auth fails to write to storage

因为我已经建立了我使用相同的存储引擎作为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; 
    } 

} 

?> 
+0

另一个问题可能是,存储(和Zend_Auth的)不具有相同的配置。写在一个地方,阅读另一个地方。 – AsTeR 2012-02-14 20:26:36

回答

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会话存储写入的执行和读功能:

/** 
* 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方法之后写的方法?

无论如何,正如我之前所说,你在做什么应该工作。

+0

嗯,我想我已经做了所有种类的实验,这个东西和所有我得到的是精神上的瘀伤。基本上,我已经通过这本书做了它,然后修改,然后重写,然后用抽象的随机试验没有达成任何一致的结论。当更新的存储,它的工作,但前提是用户登陆同一个页面上,并终于可以使用一次刷新。如果我有一个重定向,这是行不通的,除非它是在加载的另一个类的类,即更新存储等等等等 我的结论是,这个垃圾绝对是随机的。不过谢谢。 – John 2009-10-20 10:28:43

+0

只是为了确认设置存储直接做的工作对我来说。我用这个方法断开时强制身份在调试模式下,所以我可以用我的ID打开登录页面登录。我认为这是所描述的会话问题是您最可能遇到的问题。 – Jai 2010-03-24 00:26:20

0

因此,在页面重新载入时,您可以获取会话,而不是如果重定向?你是否在不同的域名上重定向?那么这可能是Cookies的一个问题,你需要手动设置session.cookie_domain ini变量。

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

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

[email protected]:~# less /var/lib/php5/sess_081fee38856c59a563cc320899f6021f 
foo_auth|a:1:{s:7:"storage";a:1:{s:9:"user_id";s:2:"77";}} 
+0

诺诺,这是相同的域名。不过,我会检查cookie。到这时候,我几乎可以确定它可能是几乎任何东西,包括全球变暖,嘿。 – John 2009-10-22 10:21:53

0

地址:

register_shutdown_function('session_write_close'); 

索引。PHP前:

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

这没有帮助 – 2016-10-03 18:09:24