2009-09-17 13 views
5

Esto es muy simple. Puedo escribir¿Cómo funciona el almacenamiento Zend_Auth?

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

y luego quiero, en un proceso separado para cargar este $ usuario, pero no puedo porque

$user = $auth->getIdentity(); 

está vacía. ¿No acabo de ... ESTABLECERLO? Por que no funciona? Halp?

[EDIT 2011-04-13]

Esto se ha preguntado hace casi dos años. Sin embargo, el hecho es que repetí la pregunta en julio de 2010 y obtuve una respuesta fantástica que en ese momento simplemente no entendía.

Enlace: Zend_Auth fails to write to storage

Desde entonces he construido una clase litte muy agradable que yo uso (a veces con ajustes extra) en todos mis proyectos usando el mismo motor de almacenamiento como Zend_Auth pero eludiendo todo lo malo.

<?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

El otro problema podría ser que el almacenamiento (y Zend_Auth) no tienen la misma configuración. Escribiendo en un lugar, leyendo en otro. – AsTeR

Respuesta

1

Se supone que funciona.

Aquí está la implementación de la función 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(); 
} 

Ésta es la puesta en práctica de la escritura PHP Almacenaje de la sesión y leyó funciones:

/** 
* 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; 
} 

¿Seguro que va a cargar la misma instancia de la clase Zend_Auth?

¿Está utilizando

$auth = Zend_Auth::getInstance(); 

Tal vez usted está llamando el método de escritura después del método getIdentity?

De todos modos, como he dicho antes, lo que está haciendo debería funcionar.

+0

Bueno, creo que he hecho todo tipo de experimentos con esto y todo lo que obtuve fueron moretones mentales. Básicamente, lo hice por el libro, luego con modificaciones, luego con reescrituras, luego con experimentos abstractos aleatorios sin llegar a ninguna conclusión coherente. Al actualizar el almacenamiento, funcionó, pero solo si el usuario aterrizó en la misma página, y finalmente se podrá utilizar la próxima actualización. Si tuviera una redirección, no funcionaría a menos que estuviera en una clase que cargó otra clase, que actualizó el almacenamiento, etc. Mi conclusión es que esta basura es absolutamente aleatoria. Gracias sin embargo. – John

+0

Solo para confirmar la configuración, el almacenamiento directamente funciona para mí. Utilizo ese método para forzar la identidad en modo de depuración cuando estoy desconectado, así que puedo iniciar sesión con mi página de inicio de sesión de ID abierta. Creo que este es un problema de sesión como se describe es su problema más probable. – Jai

0

Entonces, en una recarga de página puede recuperar la sesión, ¿pero no si está redireccionando? ¿Estás redirigiendo en un nombre de dominio diferente? Entonces podría ser un problema con las cookies y tendría que configurar manualmente la variable ini session.cookie_domain.

Compruebe si la cookie llamada PHPSESSID se ha configurado correctamente y si se envía al servidor en cada solicitud de página. ¿Es constante o cambia en cada pedido?

Además, es posible que desee comprobar si los datos de la sesión se guardan correctamente en el disco. Las sesiones se pueden encontrar en el directorio definido por la variable ini session.save_path. ¿El archivo correspondiente a su PHPSESSID existe y contiene una entrada significativa? En mi caso contiene

[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

Nono, es el mismo dominio. Sin embargo, revisaré la galleta. En este momento estoy casi seguro de que podría ser prácticamente cualquier cosa, incluido el calentamiento global, je. – John

0

Añadir:

register_shutdown_function('session_write_close'); 

al índice.php before:

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

Esto no ayudó –

Cuestiones relacionadas