Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
j'ai un soucis avec un script d'authentification des utilisateurs et je me casse la tête depuis deux jours, je ne comprends pas pourquoi les méthodes de Zend_Auth ne fonctionnent pas et génèrent une exception.
voici le code du l'action login :
public function loginAction()
{
$_subscribeForm = new Dentiste_Form_Dentiste();
$this->view->subscribeform = $_subscribeForm;
$_loginForm = new Dentiste_Form_LoginForm();
$_loginForm->submit->setLabel('Login');
$this->view->loginform = $_loginForm;
if ($this->_request->isPost ())
{
$_data = $this->_request->getPost ();
if ($_loginForm->isValid ( $_data ))
{
$_login = $_loginForm->getValue( 'login' );
$_password = $_loginForm->getValue( 'password' );
$dbAdapter = Zend_Db_Table_Abstract::getDefaultAdapter();
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
$authAdapter->setTableName ( 'dentistes' )
->setIdentityColumn ( 'login' )
->setCredentialColumn ( 'password' )
->setCredentialTreatment ( 'MD5(?)' )
->setIdentity ( $_login )
->setCredential ( $_password );
$authAuthenticate = $authAdapter->authenticate ();
if( $authAuthenticate->isValid ())
{
$storage = Zend_Auth::getInstance()->getStorage ();
$this->_helper->redirector ( 'index','index');
}
else
{
$this->view->message = 'Login failed.';
}
}
}
}
le problème est précisa-ment dans la ligne :
$storage = Zend_Auth::getInstance()->getStorage ();
et merci de me répondre
Hors ligne
Salut, alors tout d'abord tu es dans la section ZF2 alors que tu utilises ZF1.X donc tu n'es pas dans la bonne section. De plus sans l'erreur que tu as c'est pas facile de savoir d'où vient le problème.
Ensuite ta méthode ne peux pas fonctionner puisque tu n'enregistre rien dans Zend_Auth. Tu vérifies bien si l'authentification est valide mais tu n'enregistre pas l'info.
Tu dois ajouter après ton isValid() :
[lang=php] $identity = $authAdapter->getResultRowObject(); // Tu peux préciser si tu veux un champ précis $auth = Zend_Auth::getInstance(); $auth->getStorage()->write($identity);
Personnellement je ne fais pas de cette manière mais ça devrait fonctionner comme tu le fais si tu rajoute ces lignes.
Tu n'utilises pas la session donc je vois mal comment ça pourrait complètement fonctionner.
Voici comment j'ai fait mais il y a de ça quelques temps, étant concentré sur ZF2 je n'ai pas cherché à l'optimiser. Ceci dit ça fonctionne.
[lang=php] public function loginAction() { Zend_Session::start(); // On s'assure que la session est démarrée // Récupération de la requête $request = $this->getRequest(); // Vérification si la page a bien été appelée à partir d'un formulaire if ($request->isPost() && $this->_loginForm->isValid($request->getPost())) { // Validation du formulaire $data = $this->_loginForm->getValues(); $login = $data['login']; $password = $data['password']; //création d'un adpatateur d'authentification utilisant une base de données //le premier argument correspond à l'adptateur par défaut //le second correspond à la table qui est utilisée pour l'authentification //le troisième indique la colonne utilisée pour représenter l'identité (le login) //le quatrième argument indique la colonne utilisée pour représenter le crédit (le password) $authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Db_Table_Abstract::getDefaultAdapter(), 'flux_users', 'username', 'password'); // Préparation de la requête d'authentification en indiquant l'identité et le crédit $authAdapter->setIdentity($login); $authAdapter->setCredential($password); $authAdapter->setCredentialTreatment('SHA1(?) AND group_id > 0'); // Exécution de la requete d'authentification et enregistrement du résultat $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authAdapter); // Si l'authentification a réussi if ($result->isValid()) { // Permet de récupérer l'objet utilisateur $identity = $authAdapter->getResultRowObject('id'); // Stockage de l'identité sous forme d'objet $this->getAuth()->getStorage()->write($identity); // Permet de regénérer l'identifiant de la session Zend_Session::regenerateId(); // Redirection //$this->_helper->_redirector('index', 'index'); $this->_redirect($this->view->url(array('controller' => 'index'), 'default', true)); } } $this->_redirect($this->view->url(array('controller' => 'login'), 'default', true)); } public function logoutAction() { // Réinitisalisation de l'instance d'authentification et destruction de la session $auth = Zend_Auth::getInstance(); $auth()->clearIdentity(); Zend_Session::destroy(); $this->_redirect($this->view->url(array('controller' => 'index'), 'default', true)); }
Hors ligne
merci pour la réponse...mais j'ai le même problème avec getStorage().
voici ce que j'ai mis après isValide():
if( $authAuthenticate->isValid ()) { $identity = $authAdapter->getResultRowObject(); $auth = Zend_Auth::getInstance(); $auth->getStorage()->write($identity); $this->_helper->redirector ( 'index','index'); }
et ça me donne une exception
Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller class ("Dentiste_ErrorController")' in C:\zendprojects\library\Zend\Controller\Plugin\Broker.php on line 336.
Zend_Controller_Dispatcher_Exception: Invalid controller class ("Dentiste_ErrorController") in C:\zendprojects\library\Zend\Controller\Dispatcher\Standard.php on line 352.
je suis sur après l'exécution de quelque tests que le problème réside dans la ligne du code :
$auth->getStorage()->write($identity);
je suis hyper frustré
Hors ligne
Commence par lire le code que j'ai mis avec les débuts de session et lire la doc officielle. Il me semble qu'il y a des exemples d'utilisation. Je suis pas sûr que tu ais cherché très longtemps après les quelques billes que je t'ai donné.
Essai d'avoir le vrai message d'erreur là ça ne te donne rien si ce n'est qu'il n'arrive pas à trouver le contrôleur qui va permettre d'afficher le message d'erreur.
Evite de faire plein de postes partout, celui-ci sera déplacé par administrateur.
Hors ligne
oui j'ai fouiller un peut partout et j'ai lu presque tout les tutoriaux...le même exemple presque est refait partout même dans le manuelle de la version 1.11.11.
Hors ligne
Tu as initialisé la session ?
Hors ligne
merci Orkin pour votre aide...l'erreur réside dans le fichier de configuration Application.Ini
resources.session.save_path = APPLICATION_PATH "/../data/session" resources.session.use_only_cookies = true resources.session.remember_me_seconds = 864000
ces trois ligne de code ont bloqués l'authentification avec authenticate()..mais maintenant j'ai un autre problème avec : write($identity); cette méthode retourne null et je sais pas pourquoi, voici le code
if( $_result->isValid ()) { $identity = $authAdapter->getResultRowObject(); $auth = Zend_Auth::getInstance(); $auth->getStorage()->write($identity); $this->_helper->redirector ( 'index','index'); }
ici $authAdapter->getResultRowObject(); retourne un objet contenant l'enregistrement dans la table de base de données mais $auth->getStorage()->write($identity); retourne Null
??
Hors ligne
C'est normal que $auth->getStorage()->write($identity) renvoi null. En prenant le temps lire la PHPDoc de l'interface Zend_Auth_Storage_Interface on peut y trouver :
/**
* Writes $contents to storage
*
* @param mixed $contents
* @throws Zend_Auth_Storage_Exception If writing $contents to storage is impossible
* @return void
*/
public function write($contents);
Cette méthode sert uniquement à enregistrer en session.
Pour vérifier si l'utilisateur est connecté et bien identifié il existe $auth->hasIdentity() (qui renvoi un boolean) et $auth->getIdentity() (qui renvoi le contenu qu'il y avait dans la variable $identity)
Hors ligne
ok mais lorsque je veut veut vérifier si l'utilisateur est connecté : if ($auth->hasIdentity()) ..ici renvoie Null pourtant l'action auth a fait une redirection a index et l'utilisateur est authentifié...
Hors ligne
Franchement si tu fais pas un effort d'expliquer correctement ton problème, je vois pas comment on pourrait t'aider... Tu dis que la méthode write() renvoi null mais c'est normal et ensuite qu'en fait le problème ne vient pas de là ...
Si l'utilisateur est authentifié et que la méthode hasIdentity() renvoi null c'est que tu dois mal l'utiliser. Tu n'as pas à l'utiliser dans le processus d'authentification mais dans le cas où tu as besoin de savoir si l'utilisateur est authentifié. Donc si isValid() renvoi true et qu'il n'y a pas d'erreur quand tu fais $auth->getStorage()->write($identity); tout est OK.
A quel endroit fais tu appels à $auth->hasIdentity() ? et comment déclares tu ta variable $auth ?
As-tu réellement lu la doc, je viens d'aller y faire un tour et tout y est expliqué.
Hors ligne