Bonjour,

J'ai commencé CakePhp recemment et je bute sur un problème que je ne comprend pas lors de l'authentification, je n'arrive pas du tout à m'authentifier.....

La fonction login:

public function login()
        {
                   $this->set('title_for_layout', 'Connexion');
                 if($this->request->is('post'))
           {
            if($this->Auth->login()){
               $this->Session->setFlash('Vous êtes maintenant connecté.','notif');      
            }
            else
            {

              $this->Session->setFlash('Mot de passe ou utilisateur incorrect.','notif',array('type'=>'erreur'));
            }
           }
        }

Je vérifie le sql_dump lors de la connexion et j'ai ça:
SELECT User.id, User.username, User.password, User.email, User.created FROM cake.users AS User WHERE User.username = 'TEST' LIMIT 1

Comme vous le voyez, le password n'est jamais envoyé, j'ai pourtant:

<?php echo $this->Form->create('User') ?>
    <?php echo $this->Form->input('username'); ?    
    <?php echo $this->Form->input('password'); ?>
    <?php   echo $this->Form->end('valider'); ?>

où est le probleme ? (j'ai volentairement omis le hashage pour éviter d'autres problemes pour le moment)

Merci de votre aide

6 réponses


Lartak
Réponse acceptée

Alors, pour commencer, il ne te faut pas utiliser Security::hach pour encrypter le mot de passe, si tu utilises le cryptage par défaut, tu as deux solutions, soit tu utilises la méthode password du composant Auth dans ta fonction d'inscription du controller :

$this->Auth->password($d['User']['password'])

Ou alors, dans la méthode beforeSave de ton modèle User:

public function beforeSave($options = array()) {
    if (isset($this->data[$this->alias]['password'])) {
        $passwordHasher = new SimplePasswordHasher();
        $this->data[$this->alias]['password'] = $passwordHasher->hash(
            $this->data[$this->alias]['password']
        );
    }
    return true;
}

Sans oublier d'ajouter au début du modèle :

App::uses('SimplePasswordHasher', 'Controller/Component/Auth');

Ensuite, vu que pour l'inscription le mot de passe doit obligatoirement être défini, je te conseille de le mettre en règle de validation au lieu de faire la vérification dans ta fonction, surtout que de la manière que tu fais la vérification sur le mot de passe, tu ne fais qu'encrypter le mot de passe si sa valeur n'est pas vide, ce qui fait que si l'utilisateur ne le défini pas, le champ sera vide en base de données.

Bonsoir.

Comme vous le voyez, le password n'est jamais envoyé, j'ai pourtant:

Le mot de passe n'apparaît pas dans la requête SQL, mais il est bien utilisé.

j'ai volentairement omis le hashage pour éviter d'autres problemes pour le moment

Si tu ne hashe pas le mot de passe lors de l'enregistrement de l'utilisateur, tu ne pourras pas effectuer de connexion d'utilisateur, étant donné que CakePHP s'attend à ce qu'il soit hashé pour l'authentification de ceux-ci.

Par contre, puisque tu débute avec CakePHP, si tu as des connaissances en POO, dont notamment l'ORM, je te recommande fortement de passer à la V.3 de CakePHP.

Lou Miou
Auteur

Merci pour la réponse rapide, je ne comprend pas pourquoi je ne vois pas le mot de passe avec le sql_dump, sur la video sur ce site il y a bien un AND avec le mot de passe envoyé .....j'ai modifié le code pour crypter le mot de passe lors de l'inscription, j'ai ça maintenant

 public function inscription()
      {
         if($this->request->is('post'))
         {

          $d=$this->request->data;
          $d['User']['id']=null;
          if(!empty($d['User']['password']))
          {$d['User']['password']=Security::hash($d['User']['password'],null,true); }    
            if($this->User->save($d,true,array('username','password','email')))
            {
                $this->Session->setFlash("Votre compte a bien été créé","notif");

            }
            else{  $this->Session->setFlash("Veuillez corriger les erreurs","notif",array('type'=>'erreur'));
                  }

           }

      }

        public function login()
        {
                   $this->set('title_for_layout', 'Connexion');

                 if($this->request->is('post'))
           {

            if($this->Auth->login()){
               $this->Session->setFlash('Vous êtes maintenant connecté.','notif');

            }

            else
            {
              $this->Session->setFlash('Mot de passe ou utilisateur incorrect.','notif',array('type'=>'erreur'));
            }

           }

        }

        public function logout()
      {
      $this->Auth->logout();
      $this->redirect($this->referer());   
         }

Mais ça ne marche toujours pas....

Lou Miou
Auteur

[](Ensuite, vu que pour l'inscription le mot de passe doit obligatoirement être défini, je te conseille de le mettre en règle de validation au lieu de faire la vérification dans ta fonction, surtout que de la manière que tu fais la vérification sur le mot de passe, tu ne fais qu'encrypter le mot de passe si sa valeur n'est pas vide, ce qui fait que si l'utilisateur ne le défini pas, le champ sera vide en base de données.)

J'ai bien des règles de validation dans mon model, je vais essayer les deux méthodes

Lou Miou
Auteur

Je suis vraiment trop bête, je viens de me rendre compte que mon champ password n'était pas assez long !

Tout marche parfaitement maintenant.

Merci pour l'aide !

De rien, avec plaisir.
Ravi d'avoir pu t'aider.