2009-09-17 14 views
5

Das ist sehr einfach. Ich schreibeWie funktioniert der Zend_Auth Speicher?

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

Und dann will ich, in einem separaten Prozess diesen $ Benutzer zu laden, aber ich kann nicht, weil

$user = $auth->getIdentity(); 

leer. Habe ich nicht einfach ... SET? Warum funktioniert es nicht? Half?

[EDIT 2011-04-13]

Dies wurde vor fast zwei Jahren gefragt. Tatsache ist jedoch, dass ich die Frage im Juli 2010 wiederholt habe und eine fantastische Antwort bekommen habe, die ich damals einfach nicht verstanden habe.

-Link: Zend_Auth fails to write to storage

ich eine sehr nette litte Klasse seit gebaut haben, die ich (manchmal mit zusätzlichen Zwicken) verwenden in allen meinen Projekten die gleiche Speicher-Engine wie Zend_Auth verwenden, aber alle schlecht umgehen.

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

Das andere Problem könnte sein, dass der Speicher (und Zend_Auth) nicht die gleiche Konfiguration haben. An einer Stelle schreiben, an einer anderen lesen. – AsTeR

Antwort

1

Es soll funktionieren.

Hier ist die Implementierung der Auth getIdentity-Funktion.

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

Hier ist die Umsetzung der PHP Session Speicher-Schreib- und Lesefunktionen:

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

Sind Sie sicher, dass Sie die gleiche Instanz der Zend_Auth Klasse geladen werden?

Verwenden Sie

$auth = Zend_Auth::getInstance(); 

Vielleicht rufen Sie das Schreibverfahren nach dem getIdentity Methode?

Wie ich schon sagte, was Sie tun, sollte funktionieren.

+0

Nun, ich denke, ich habe alle möglichen Experimente mit diesem Ding gemacht und alles, was ich bekam, waren mentale Blutergüsse. Im Grunde habe ich es nach dem Buch gemacht, dann mit Modifikationen, dann mit Umschreibungen, dann mit abstrakten Zufallsexperimenten, ohne zu einer schlüssigen Schlussfolgerung zu gelangen. Bei der Aktualisierung des Speichers funktionierte es, aber nur, wenn der Benutzer auf der gleichen Seite gelandet war und schließlich beim nächsten Refresh verwendbar war. Wenn ich eine Umleitung hätte, würde es nicht funktionieren, außer es wäre in einer Klasse, die eine andere Klasse geladen hat, die den Speicher usw. aktualisiert hat. Meine Schlussfolgerung ist, dass dieser Mist absolut zufällig ist. Trotzdem danke. – John

+0

Nur um die Einstellung des Speichers direkt zu bestätigen funktioniert für mich. Ich verwende diese Methode, um die Identität im Debug-Modus zu erzwingen, wenn die Verbindung getrennt ist, damit ich mich mit meiner offenen ID-Anmeldeseite anmelden kann. Ich denke, dass es sich um ein Problem mit der Sitzung handelt, wie beschrieben, ist Ihr wahrscheinlichstes Problem. – Jai

0

So auf einer Seite neu laden können Sie die Sitzung abrufen, während nicht beim Umleiten? Verweisen Sie auf einen anderen Domain-Namen? Dann könnte es Probleme mit den Cookies geben und Sie müssten session.cookie_domain ini Variable manuell setzen.

Überprüfen Sie, ob der Cookie mit der Bezeichnung PHPSESSID ordnungsgemäß festgelegt wurde und ob er bei jeder Seitenanforderung an den Server gesendet wird. Ist es konstant oder verändert es sich bei jeder Anfrage?

Sie können auch überprüfen, ob die Sitzungsdaten ordnungsgemäß auf dem Datenträger gespeichert werden. Die Sitzungen befinden sich in dem durch die ini-Variable session.save_path definierten Verzeichnis. Entspricht die Datei Ihrer PHPSESSID dort und enthält sie einen aussagekräftigen Eintrag? In meinem Fall enthält es

[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 ist die gleiche Domain. Ich werde jedoch den Keks auschecken. Zu dieser Zeit bin ich mir fast sicher, dass es so ziemlich alles sein könnte, einschließlich der globalen Erwärmung, heh. – John

0

Anzahl:

register_shutdown_function('session_write_close'); 

zu indizieren.php vorher:

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

Das hat nicht geholfen –

Verwandte Themen