2009-09-17 6 views
5

C'est très simple. J'écrisComment fonctionne le stockage Zend_Auth?

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

Et puis je veux, dans un processus séparé pour charger cet utilisateur de $, mais je ne peux pas parce que

$user = $auth->getIdentity(); 

est vide. N'ai-je pas juste ... SET? Pourquoi ça ne marche pas? Halp?

[EDIT 2011-04-13]

Cela a été demandé il y a près de deux ans. Le fait est, cependant, que j'ai répété la question en juillet 2010 et obtenu une réponse fantastique que je ne comprenais tout simplement pas à l'époque.

Lien: Zend_Auth fails to write to storage

J'ai depuis construit une très belle classe litte que j'utilise (parfois avec peaufinage supplémentaire) dans tous mes projets en utilisant le même moteur de stockage Zend_Auth mais contournent tous les mauvais.

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

L'autre problème pourrait être que le stockage (et Zend_Auth) n'a pas la même configuration. Écrire sur un lieu, en lisant un autre. – AsTeR

Répondre

1

Il est supposé fonctionner.

Voici l'implémentation de la fonction 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(); 
} 

Voici la mise en œuvre de la session PHP stockage écriture et de lecture fonctions:

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

Etes-vous sûr que vous chargez la même instance de la classe Zend_Auth?

Utilisez-vous

$auth = Zend_Auth::getInstance(); 

Peut-être que vous appelez la méthode d'écriture après la méthode getIdentity? Quoi qu'il en soit, comme je l'ai déjà dit, ce que vous faites devrait fonctionner.

+0

Eh bien, je pense que j'ai fait toutes sortes d'expériences avec cette chose et tout ce que j'ai eu, c'était des contusions mentales. Fondamentalement, je l'ai fait par le livre, puis avec des modifications, puis avec des réécritures, puis avec des expériences aléatoires abstraites sans parvenir à une conclusion cohérente. Lors de la mise à jour du stockage, cela a fonctionné, mais seulement si l'utilisateur a atterri sur la même page, et serait enfin utilisable à la prochaine actualisation. Si j'avais une redirection, ça ne marcherait pas si c'était dans une classe qui chargeait une autre classe, qui mettait à jour le stockage etc ... Ma conclusion est que cette merde est absolument aléatoire. Merci quand même. – John

+0

Juste pour confirmer la configuration du stockage directement fonctionne pour moi. J'utilise cette méthode pour forcer l'identité en mode débogage lorsqu'il est déconnecté afin que je puisse me connecter avec ma page de connexion d'ID ouverte. Je pense que c'est un problème de session tel que décrit est votre problème le plus probable. – Jai

0

Donc, sur un rechargement de page, vous pouvez aller chercher la session, sans la rediriger? Redirigez-vous sur un nom de domaine différent? Ensuite, il peut être un problème avec les cookies et vous devez définir manuellement session.cookie_domain variable ini.

Vérifiez si le cookie nommé PHPSESSID a été correctement défini et s'il est envoyé au serveur à chaque demande de page. Est-ce constant ou change-t-il à chaque demande?

Vous pouvez également vérifier si les données de session sont correctement enregistrées sur le disque. Les sessions peuvent être trouvées dans le répertoire défini par la variable ini session.save_path. Est-ce que le fichier correspondant à votre PHPSESSID est là et contient-il une entrée significative? Dans mon cas, il contient

[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, c'est le même domaine. Je vais vérifier le cookie, cependant. À ce moment-là, je suis presque sûr que cela pourrait être à peu près n'importe quoi, y compris le réchauffement climatique, heh. – John

0

Ajouter:

register_shutdown_function('session_write_close'); 

à l'index.php avant:

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

Cela n'a pas aidé –

Questions connexes