Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 03-04-2012 13:13:08

Mehrez1985
Membre
Date d'inscription: 25-03-2012
Messages: 10

problème avec Zend_Auth

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 smile

Hors ligne

 

#2 03-04-2012 14:45:54

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: problème avec Zend_Auth

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() :

Code:

[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.

Code:

[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

 

#3 03-04-2012 15:34:41

Mehrez1985
Membre
Date d'inscription: 25-03-2012
Messages: 10

Re: problème avec Zend_Auth

merci pour la réponse...mais j'ai le même problème avec  getStorage().
voici ce que j'ai mis après isValide():

Code:

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é mad

Hors ligne

 

#4 03-04-2012 15:50:13

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: problème avec Zend_Auth

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

 

#5 03-04-2012 16:36:02

Mehrez1985
Membre
Date d'inscription: 25-03-2012
Messages: 10

Re: problème avec Zend_Auth

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

 

#6 03-04-2012 16:46:36

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: problème avec Zend_Auth

Tu as initialisé la session ?

Hors ligne

 

#7 04-04-2012 11:50:00

Mehrez1985
Membre
Date d'inscription: 25-03-2012
Messages: 10

Re: problème avec Zend_Auth

merci Orkin pour votre aide...l'erreur réside dans le fichier de configuration Application.Ini

Code:

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

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
??
neutral

Hors ligne

 

#8 04-04-2012 12:05:38

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: problème avec Zend_Auth

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

 

#9 04-04-2012 12:13:29

Mehrez1985
Membre
Date d'inscription: 25-03-2012
Messages: 10

Re: problème avec Zend_Auth

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

 

#10 04-04-2012 14:18:41

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: problème avec Zend_Auth

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages