Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] - Zend_auth "gubi sesję" ?
Forum PHP.pl > Forum > PHP > Frameworki
webcitrn
Jestem dopiero na pocztku przygody z ZF a napotkałem rzecz która od soboty skutecznie mnie zniechęca.

Mianowicie - mechanizm logowania przy pomocy Zend_Auth. Sprawa wygląda dość standardowo - w /profil/logowanie jest sprawdzanie czy użytkownik jest zalogowany, jeśli tak - przekierowanie na /profil, jeśli nie - wyświetlenie formularza. Po wypełnieniu formularza ten przekierowuje do /profil/logowanie, tam następuje sprawdzanie autentycznośći danych, jeśli są ok jest zapis do miejsca przechowującego dane (u mnie sesja) i przekierowanie na /profil. Oczywiśćie w /profil/index jest sprawdzane czy użytkownik jest rzeczywiście zalogowany, jeśli nie - odsyłamy go na /profil/logowanie, jeśli tak - pokazujemy mu stronę z profilem. Teraz fragmenty kodów:

[index.php - bootstrapper]
  1. <?php
  2. $auth=Zend_Auth::getInstance();
  3. $auth->setStorage(new Zend_Auth_Storage_Session());
  4. ?>


[profilController:]
  1. <?php
  2. public function indexAction() {
  3. $auth=Zend_Auth::getInstance();
  4. if(!$auth->hasIdentity())
  5. $this->_redirect('/profil/logowanie');
  6.  
  7. }
  8.  
  9. public function logowanieAction() {
  10.  
  11. $auth=Zend_Auth::getInstance();
  12. if($auth->hasIdentity())
  13. $this->_redirect('/profil');
  14.  
  15. $req=$this->getRequest();
  16. $redirect=$req->getPost('redirect');
  17. if(empty($redirect{0}))
  18. $redirect=$req->getServer('REQUEST_URI');
  19. if(empty($redirect{0}))
  20. $redirect='/profil';
  21.  
  22. $errors=array();
  23. if($req->isPost()) {
  24. $username=$req->getPost('username');
  25. $password=$req->getPost('pass');
  26. if(empty($username{0}))
  27. $errors['username']='Nie podano nazwy użytkownika';
  28. if(empty($password{0}))
  29. $errors['pass']='Nie podano hasła';
  30.  
  31. if(count($errors)==0) {
  32.  
  33. $adapter=new Zend_Auth_Adapter_DbTable(
  34. $this->db, 
  35. 'users', 
  36. 'username',
  37. 'password',
  38. 'md5(?)' 
  39. );
  40. $adapter->setIdentity($username);
  41. $adapter->setCredential($password);
  42.  
  43. $res=$auth->authenticate($adapter);
  44. if($res->isValid()) {
  45. $user=new DatabaseObject_Users($this->db);
  46. $uid=$adapter->getResultRowObject()->user_id;
  47. $user->load($uid);
  48. $user->data->load($uid);
  49. $user->loginSuccess();
  50. $id=$user->createAuthIdentity();
  51. $auth->getStorage()->write($id);
  52. $this->_redirect($redirect);
  53. }
  54.  
  55. $errors['username']=DatabaseObject_Users::LoginFailure($username,$res->getCode());
  56.  
  57. }
  58.  
  59. }
  60. $this->view->errors=$errors;
  61. $this->view->redirect=$redirect;
  62. }
  63. ?>


Zachowanie tego jest bardzo dziwne .. Gdy podczas logowania podglądam co się dzieje w metodzie logowania wszystko wygląda ok (wchodzi do warunku if($res->isValid()) {, wszystkie dane wydaje że że zapisuje się dobrze itp), natomiast już po przekerowaniu gubi wszystkie zapisane przed chwilą informacje, oczywiście łącznie z tym że użytkownik jest zalogowany .. Coś jak oklepany problem z gubieniem sesji w czystym php.

Dodam jeszcze że często mam z tym kodem tak, że podczas przerywania logowania wypisywaniem na ekran pewnych rzeczy (echo(); die()) wchodzi mi w panel zalogowanego użytkownika (faktycznie będąc zalogowanym) ale dopiero wtedy gdy przejrzę wszystsko co chcę i wyrzucę debugujące die() .. Jest mi ktoś w stanie choć naświetlić temat ? :\
stloyd
Tak profilaktycznie spytam... masz w pliku index.php na początku taki kawałek kodu
  1. <?php
  2. // (...)
  3. Zend_Session::start();
  4. // i tutaj dopiero start Zend_Auth'a
  5. ?>


Pozdrawiam (;
webcitrn
Hehehe, no to teraz się uśmiałem smile.gif))) Bo nie miałem winksmiley.jpg))
Ale niewiele dało, index:
  1. <?php
  2. Zend_Session::start();
  3. // set authentication
  4. $auth=Zend_Auth::getInstance();
  5. $auth->setStorage(new Zend_Auth_Storage_Session());
  6. ?>

i sytuacja jest identyczna ..

--- EDIT:
Problem rozwiązany smile.gif Za $kontroler->_redirect(); brakowało return; smile.gif
wklejam poprawiony kod:
  1. <?php
  2. public function logowanieAction() {
  3.  
  4. $auth=Zend_Auth::getInstance();
  5. if($auth->hasIdentity()) {
  6. $this->_redirect('/profil');
  7. return;
  8. }
  9.  
  10. $req=$this->getRequest();
  11. $redirect=$req->getPost('redirect');
  12. if(empty($redirect{0}))
  13. $redirect=$req->getServer('REQUEST_URI');
  14. if(empty($redirect{0}))
  15. $redirect='/profil';
  16.  
  17. $errors=array();
  18. if($req->isPost()) {
  19. $username=$req->getPost('username');
  20. $password=$req->getPost('pass');
  21. if(empty($username{0}))
  22. $errors['username']='Nie podano nazwy użytkownika';
  23. if(empty($password{0}))
  24. $errors['pass']='Nie podano hasła';
  25.  
  26. if(count($errors)==0) {
  27.  
  28. $adapter=new Zend_Auth_Adapter_DbTable(
  29. $this->db, 
  30. 'users', 
  31. 'username',
  32. 'password',
  33. 'md5(?)' 
  34. );
  35. $adapter->setIdentity($username);
  36. $adapter->setCredential($password);
  37.  
  38. $res=$auth->authenticate($adapter);
  39. if($res->isValid()) {
  40. $user=new DatabaseObject_Users($this->db);
  41. $uid=$adapter->getResultRowObject()->user_id;
  42. $user->load($uid);
  43. $user->data->load($uid);
  44. $user->loginSuccess();
  45. $id=$user->createAuthIdentity();
  46. $auth->getStorage()->write($id);
  47. $this->_redirect($redirect);
  48. return;
  49. }
  50.  
  51. $errors['username']=DatabaseObject_Users::LoginFailure($username,$res->getCode());
  52.  
  53. }
  54.  
  55. }
  56. $this->view->errors=$errors;
  57. $this->view->redirect=$redirect;
  58. }
  59. ?>

temat można zamknąć, zostawić dla potomnych .. błąd wyjątkowo trudny do wytropienia smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.