Posts Tagged ‘Zend_Auth’

Zend_Auth rememberMe

Sunday, May 8th, 2011

Trochę się namęczyłem przy tym(1,5h) dlatego że nie wgłębiałem się nigdy w zasadę działania Zend_Session i dlatego że skopiowałem bezmyślnie kod z jakiegoś przykładu, który prawie działał.

Zend_Session to bardzo fajna klasa, nie dość że łatwo się używa to dodatkowo wprowadza metody które rozszerzają możliwości standardowej sesji php. Do rzeczy jak zrobić zapamiętaj mnie wykorzystując Zend_Auth.

Żeby tego dokonać trzeba wiedzieć że Zend wprowadza dodatkowy mechanizm który pozwala na ustawienie czasu życia konkretnego Zend_Session_Namespace poprzez metodę setExpirationSeconds($seconds, $variables = null). Można też po podaniu nazw zmiennych w danym namespace ustawić wygaśnięcie tylko dla nich. Czyli pierwszy krok to ustawienie czasu życia sesji dla klasy Zend_Auth czyli np.

$session = new Zend_Session_Namespace(‘Zend_Auth’);
$seconds  = 60 * 60 * 24 * 7; // 7 dni
$session->setExpirationSeconds($seconds);

Ale to jeszcze nie wszystko, bo sesja w php trwa jedynie tyle ile określa parametr session.cookie_lifetime, który jest ustawiony w php.ini i najczęściej przyjmuje wartość 0 co oznacza że ciasteczko, które przechowuje identyfikator sesji straci ważność po zamknięciu okna przeglądarki.  Parametr ten możemy zmienić we wspomniamym wyżej php.ini, .htaccess, lub używając metody ini_set lub funkcji php session_set_cookie_params albo korzystając z metody klasy Zend_Session::rememberMe – która jako parametr pobiera liczbę sekund.
Należy pamiętać żeby zrobić to przed zaczęciem korzystania z sesji. Ja np. ustawiłem to w application.ini: phpSettings.session.cookie_lifetime = 604800.

Błąd który popełniłem na początku i który zmusił mnie do przejrzenia źródeł Zend_Session i Zend_Session_Namespace było  skopiowanie kodu z jakiegoś przykładu w którym parametr sessions.cookie_liftime był ustawiany po wykonaniu logowania. Co było w tym złego? To że używając w innych miejscach sesji parametr sessions.cookie_liftime był standardowo ustawiany na 0 co powodowało usunięcie pliku cookie po zamknięciu okna przeglądarki. Nie od razu to skojarzyłem bo nie na każdej podstronie używałem dodatkowo sesji.