2009-09-17 12 views
5

To bardzo proste. PiszęJak działa pamięć masowa Zend_Auth?

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

A potem chcę, w oddzielnym procesie ładowania to $ user, ale nie mogę, bo

$user = $auth->getIdentity(); 

jest pusty. Czy ja nie ... ZROBIŁEM? Dlaczego to nie działa? Halp?

[EDIT 2011-04-13]

ten został poproszony prawie dwa lata temu. Faktem jest jednak, że powtórzyłem to pytanie w lipcu 2010 roku i otrzymałem fantastyczną odpowiedź, której wtedy nie zrozumiałem.

Link: Zend_Auth fails to write to storage

Mam ponieważ zbudowany bardzo ładny klasę litte że używam (czasami z dodatkową szczypanie) we wszystkich moich projektach przy użyciu tego samego silnika do przechowywania, jak Zend_Auth ale obejście wszystkich źle.

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

Innym problemem może być to, że pamięć (i Zend_Auth) nie ma tej samej konfiguracji. Pisanie w jednym miejscu, czytanie na innym. – AsTeR

Odpowiedz

1

To ma działać.

Oto implementacja funkcji 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(); 
} 

Oto realizacja zapisu PHP Session Storage i czytać funkcje:

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

Czy jesteś pewien, że ładujesz tę samą instancję klasy Zend_Auth?

Używasz

$auth = Zend_Auth::getInstance(); 

Może jesteś wywołanie metody zapisu po metody getIdentity?

W każdym razie, jak już powiedziałem, to, co robisz, powinno zadziałać.

+0

Cóż, wydaje mi się, że przeprowadziłem eksperymenty z tym wszystkim, a wszystko, co miałem, to były mentalne siniaki. Zasadniczo zrobiłem to za pomocą książki, następnie z modyfikacjami, następnie z przepisywaniem, a następnie z abstrakcyjnymi losowymi eksperymentami bez osiągania jakichkolwiek spójnych wniosków. Podczas aktualizowania pamięci działało, ale tylko wtedy, gdy użytkownik wylądował na tej samej stronie i na końcu mógł zostać ponownie odświeżony. Gdybym miał przekierowanie, nie działałby, gdyby nie był w klasie, która ładowała inną klasę, która aktualizowałaby pamięć itp. Mój wniosek jest taki, że to gówno jest absolutnie przypadkowe. W każdym razie dzięki. – John

+0

Tylko potwierdzenie ustawienia pamięci bezpośrednio działa dla mnie. Używam tej metody, aby wymusić tożsamość w trybie debugowania po rozłączeniu, więc mogę zalogować się za pomocą strony logowania do otwartego ID. Myślę, że to problem z sesją, jak opisano, jest twoim najprawdopodobniej problemem. – Jai

0

Tak więc po przeładowaniu strony możesz pobrać sesję, a nie przekierować? Czy przekierowujesz na inną nazwę domeny? Może to być problem z plikami cookie i trzeba ręcznie ustawić zmienną ini session.cookie_domain.

Sprawdź, czy plik cookie o nazwie PHPSESSID został prawidłowo ustawiony i czy jest wysyłany do serwera na każde żądanie strony? Czy jest stały lub zmienia się na każde żądanie?

Możesz również sprawdzić, czy dane sesji są poprawnie zapisane na dysku. Sesje można znaleźć w katalogu zdefiniowanym przez zmienną ini session.save_path. Czy jest tam plik odpowiadający twojemu PHPSESSID i czy zawiera on znaczący wpis? W moim przypadku to zawiera

[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, to ta sama domena. Jednak sprawdzę ciasteczko. W tym czasie jestem prawie pewien, że może to być prawie wszystko, w tym globalne ocieplenie, heh. – John

0

dodają:

register_shutdown_function('session_write_close'); 

do indeksu.php przed:

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

To nie pomogło –

Powiązane problemy