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]
<?php $auth=Zend_Auth::getInstance(); $auth->setStorage(new Zend_Auth_Storage_Session()); ?>
[profilController:]
<?php public function indexAction() { $auth=Zend_Auth::getInstance(); if(!$auth->hasIdentity()) $this->_redirect('/profil/logowanie'); } public function logowanieAction() { $auth=Zend_Auth::getInstance(); if($auth->hasIdentity()) $this->_redirect('/profil'); $req=$this->getRequest(); $redirect=$req->getPost('redirect'); $redirect=$req->getServer('REQUEST_URI'); $redirect='/profil'; if($req->isPost()) { $username=$req->getPost('username'); $password=$req->getPost('pass'); $errors['username']='Nie podano nazwy użytkownika'; $errors['pass']='Nie podano hasła'; $adapter=new Zend_Auth_Adapter_DbTable( $this->db, 'users', 'username', 'password', 'md5(?)' ); $adapter->setIdentity($username); $adapter->setCredential($password); $res=$auth->authenticate($adapter); if($res->isValid()) { $user=new DatabaseObject_Users($this->db); $uid=$adapter->getResultRowObject()->user_id; $user->load($uid); $user->data->load($uid); $user->loginSuccess(); $id=$user->createAuthIdentity(); $auth->getStorage()->write($id); $this->_redirect($redirect); } $errors['username']=DatabaseObject_Users::LoginFailure($username,$res->getCode()); } } $this->view->errors=$errors; $this->view->redirect=$redirect; } ?>
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 ? :\