Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
Je poste un message car je ne trouve pas de réponse ailleurs. Je vais tenter de donner toutes les infos afin de pouvoir solliciter au mieux votre aide.
Je veux faire une identification utilisateur via un BDD. J'ai un code en place, et l'identification se passe bien puisse que ma redirection conditionnelle se fait comme attendu. J'ai également un helper qui m'affiche le nom de l'utilisateur connecté.
Mais dès que je change d'action ou de controller je perds l'authentification... je n'arrive pas à comprendre d'ou ça peut venir. En glanant des infos à gauche ou à droite, je me dis que ça pourrait venir de la façon dont je définis mes sessions... est-ce le cas??
Pour mes sessions, j'ai créé un plugin :
<?php class Controller_Plugins_Session extends Zend_Controller_Plugin_Abstract { private $_session; private $_clientHeaders; public function __construct() { $this->_session = Zend_Registry::get('session'); $this-> _clientHeaders = $_SERVER['HTTP_USER_AGENT']; if (array_key_exists('HTTP_ACCEPT', $_SERVER)){ $this->_clientHeaders .= $_SERVER['HTTP_ACCEPT']; } $this->_clientHeaders=md5($this->clientHeaders); } public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) { if(Zend_Auth::getInstance()->hadIdentity()){ if($this->_session->clientBrowser != $this->_clientHeaders){ Zend_Session::destroy(); $this->_response->setHttpResponseCode(403); $this->_response->clearBody(); $this->_response->sendResponse(); exit; } } } public function dispatchLoopShutdown() { $this->_session->requestUli = $this->getRequest()->getRequestUri(); $this->_session->clientBrowser=$this->_clientHeaders; } }
Du côté de mon bootstrap voilà ce qu'il y a :
$configSession = new Zend_Config_Ini($confPath .'/session.ini', 'dev'); // ************************* SESSION *********************************** // Configuration de la session (impérativement avant son démarrage) Zend_Session::setOptions($configSession->toArray()); Zend_Session::setOptions(array('save_path' => $appPath . $configSession->save_path)); // Partage (et création ou restauration) de l'objet de session dans le registre // Ce premier appel à new Zend_Session_Namespace démarre la session PHP Zend_Registry::set('session', $session = new Zend_Session_Namespace($configSession->name)); ... // register plugin $frontController->registerPlugin(new Ozerise_Controller_Plugins_Sessions);
Merci pour votre aide...
Dernière modification par mymt (21-01-2010 13:14:15)
Hors ligne
Petite question.. lorsqu'une session démarre, je devrais voir des fichiers dans mon répertoire application/tmp non?? parce que là je ne vois rien s'inscrire...
Hors ligne
première erreur corrigée... le nom de ma classe n'était pas correcte dans le plugin..
J'ai donc le fichier qui est créé dans mon répertoire... mais pour le moment ça ne marche toujours pas pour conserver mon identification
Dernière modification par mymt (03-01-2010 18:02:27)
Hors ligne
j'utilise ça pour mettre l'identité de mon utilisateur dans la session
$data c'est l'objet contenant l'identité (issue de la base DB Ldap etc)
$auth = Zend_Auth::getInstance(); $auth->getStorage()->write($data);
pour toute les actions je fais
$user = Zend_Auth::getInstance()->getIdentity(); if ($user) { $this->user = clone($user); $this->view->user = clone($user); if(isset($user->profile)) { $this->user->profile = clone($user->profile); $this->view->user->profile = clone($user->profile); } }
dans le prédispatch je fais
if (!$this->_isAuthorized(false)&&!$this->_isLogged(false)) { // On va le connecter automatiquement et enchainer la procÈdure standard $returnPath=strtolower($this->makeActionPath()); $this->_redirect('/login/auth/?returnPath='.$returnPath); }
la méthode _isAuthorized vérifie que l'utilisateur à le droit de faire l'action
la méthode _isLogged
protected function _isLogged($alert=false) { $logged = true; $auth = Zend_Auth::getInstance(); if (!$auth || !$auth->hasIdentity()) { if ($alert) { $this->_messenger->addWarning("Veuillez vous identifier avant de poursuivre."); } $logged = false; } return $logged; }
A+JYT
Hors ligne
Alors de mon côté je fais ça pour enregistrer les data... est correct??
$authAdapter = new Zend_Auth_Adapter_DbTable ( Zend_Db_Table::getDefaultAdapter () ); $authAdapter->setTableName ( 'Tabonne' ) ->setIdentityColumn ( 'pseudo' ) ->setCredentialColumn ( 'password' ) ->setCredentialTreatment ( 'MD5(?)' ) ->setIdentity ( $login ) ->setCredential ( $password ); ... $storage = Zend_Auth::getInstance ()->getStorage (); $storage->write ( $authAdapter->getResultRowObject ( null, 'password' ) );
Hors ligne
J'ai pas tout compris de ce que tu fais dans ton predispatch...
My god.. c'est pas simple de démarrer avec ce framework!!
Hors ligne
D'ailleurs, après m'être authentifié, mon fichier de session n'est pas updaté (si je regarde la date et l'heure du fichier en ftp)... ca c'est pas logique.. n'y devrait il pas y avoir une mise à jour pour l'identification??... ou est ce que c'est gardé du côté client?
Hors ligne
non c'est gardé cote serveur
et oui le fichier devrait être mis à jour
dans le predispatch je vérifie que l'utilisateur à le droit de faire l'action demandé ci ce n'est pas le cas il est renvoyez vers la page de login avec en paramètre l'url de l'action demandé ainsi si l'utilisateur n'est pas logé où s'il n'a pas les droit il va sur la page de login. soit il se loge (ou se reloge avec un nouveau rôle) et l'action sera de nouveau invoqué soit il annule et revient à l'action précédente
A+JYT
Hors ligne
Désolé de revenir à la charge... je rame toujours!
Est-ce que "théoriquement" mon code, à savoir
$authAdapter = new Zend_Auth_Adapter_DbTable ( Zend_Db_Table::getDefaultAdapter () ); $authAdapter->setTableName ( 'Tabonne' ) ->setIdentityColumn ( 'pseudo' ) ->setCredentialColumn ( 'password' ) ->setCredentialTreatment ( 'MD5(?)' ) ->setIdentity ( $login ) ->setCredential ( $password ); ... $storage = Zend_Auth::getInstance ()->getStorage (); $storage->write ( $authAdapter->getResultRowObject ( null, 'password' ) );
devrait permettre la mise à jour de la session avec les paramètres en question? Comment relire de façon simple le contenue du fichier session? Car vraissemblablement c'est la que se situe l'os : les paramètres d'authentification en sont pas sauvé...
Hors ligne
En fait je viens de faire un pas à pas avec les fichiers de sessions créés... il semblerait qu'au moment où je me log, je tue la session.. en tout cas le fichier est supprimé... reste à comprendre pourquoi..
J'ai rajouté deux trois lignes de code en plus :
//récupération de l'espace de stockage $auth = Zend_Auth::getInstance (); $storage = Zend_Auth::getInstance ()->getStorage (); //$storage->write ( $authAdapter->getResultRowObject ( null, 'password' ) ); $data = $authAdapter->getResultRowObject(null, 'member_password'); echo print_r($data); echo "<br><br>"; $auth->getStorage()->write($data); echo print_r($auth->getStorage()->read());
Ca me permet de vérifier ce que je vais écrire et ce qui a été effectivement écrit... alors bonne nouvelle ce que j'écris correspond bien à ce que je veux.
Mais une fois que je choisis une autre action, lorsque je refais un read sur le getStorage, et bien ça me pond seulement un "1" à la place de mon objet détaillé. Je comprends pas comment je perds l'info.. est-ce que ça viendrait du bootstrap?? Et puis comment se fait-il que je perds aussi mon fichier de session?? Je désepsère!!
Dernière modification par mymt (04-01-2010 00:24:22)
Hors ligne
Alors pour la petite histoire c'est mon plugin sessions qui sème la zone... si je le vire et repasse en comportement standard alors ca marche... je vais devoir le debuguer!
Hors ligne