Bonjour,

Je rencontre actuellement un problème avec la fonction $this->Auth->login().

Quand mes utilisateurs utilisent le form de login.ctp => Tout est Ok
Maintenant j'aimerai les connecter manuellement via une fonction perso auth() avec les mêmes informations que je poste dans le form Login.ctp

public function auth($id,$token){
    $user = $this->User->find('first',array(
        'conditions' => array('User.id'=>$id, 'User.token'=>$token),
    ));
    debug($user); => mon tab avec mon USER => OK

    if (!empty($user)) {
        echo ('utilisateur existe ') ; 
        $this->request->data['User']['username'] =  $user['User']['username'] ;
        $this->request->data['User']['password'] =  $user['User']['password'] ;
        debug($this->request->data);
        // J'ai bien mon tab avec mes data

        if (  $this->Auth->login(  )   ) {  => impossible de se co .....  
                echo ("Vous êtes maintenant connecté");
          }else{
                echo ("Erreur de connexion, veuillez ressayer");
         }
    }else{
         echo ('utilisateur inconnu ') ; 
    }
}

Une idée ??

J'ai déja utilisé ce code dans un autre projet et il fonctionne mais la pas moyen.....
Pourtant cela me parait simple....

8 réponses


Lartak
Réponse acceptée

Bonjour.
Pour commencer, tu as un problème évident dans ta logique, tu fais appel au composant Auth, sauf que tu appelles ta fonction auth et tu fais $this->Auth->login, il est largement préférable d'éviter d'appeler une fonction comme une classe que tu vas utiliser dans ta fonction par exemple.
Ensuite, à quoi ça te sert de définir deux fois $this->request->data['User']['username'] ?
Surtout que comme te l'a dit Kareylo, que ce soit pour une comparaison ou autre, il t'est totalement inutile d'utiliser ton champ pour le mot de passe de la base de données.
Pour rappel, une fonction de connexion de base est :

public function login() {
    if ($this->request->is('post')) {
        if ($this->Auth->login()) {
            return $this->redirect($this->Auth->redirectUrl());
        }
        $this->Flash->error(__('Username ou password incorrect'));
    }
}

Source : Authentification » Identifier les utilisateurs et les connecter

C'est suffisant pour une authentification basique.

La méthode login a besoin du mot de passe non chiffré et il est chiffré dans ta base de donnée.
La deuxième solution est de lui passer directement $user.

bouks
Auteur

Kareylo,
J'ai essayé de passé $this->Auth->login( $user ) mais toujours le problème

Greg,
Je suis en mode débug donc c'est juste pour voir si je passe dans mes conditions mais oui sinon j'ai un système de notification :)

bouks
Auteur

Lartark,

Effectivement nommé la fonction auth n'est pas judicieux....
Définir $this-request->data c'est justement pour l'envoyer à $this->Auth->login(), je ne le définie pas 2 fois car il n'y a pas de data postées ( c'est peut être cela le problème ).

En gros j'aimerai me connecté automatiquement depuis une url ex : mondomaine/users/autologin/token
Le token me permets de retrouver l'utilisateur de ma BDD si je trouve un user je le co.

Voila ce que j'ai voulu faire dans le script....

et effectivement je pensaisceci suffirait mais cela fonctionne pas....

$user = $this->User->find('first',array(
    'conditions' => array 'User.token'=>$token),
));
debug($user); => mon tab avec mon USER => OK
if (  $this->Auth->login( $user  )   ) 

Est-ce que tu as un minimum consulté la documentation ?
Car si tu l'avais fait, tu aurais vu qu'ils expliquent comment faire pour connecter un utilisateur manuellement : Authentification » Connecter les utilisateurs manuellement.
Il te suffit donc par exemple de faire :

$user = $this->User->find('first', array(
    'conditions' => array('User.token'=>$token),
));
unset($user['password']);
$this->request->data['User'] = $user;
$this->Auth->login($this->request->data['User']);
return $this->redirect($this->referer());
bouks
Auteur

Justement, j'ai regardé la doc et j'ai codé en fonction de ça et je comprenais pas pourquoi je devais unset le password (mauvaise compréhension).
Je pense que le problème vient de la, je test et regarde demain.

Un grand merci de m'avoir mis sur la piste.

bouks
Auteur

Re,
Bon cela marche pas...
Je regarde de plus près

    $user = $this->User->find('first',array(
        'conditions' => array('User.id'=>$id, 'User.token'=>$token),
    ));

    if (!empty($user)) {
        echo ('utilisateur existe ') ; 
        $user = current($user);
        unset($user['password']);
        debug($user);
        $this->request->data['User'] = $user;

        if (  $this->Auth->login(  $this->request->data['User'] )   ) {
            echo ("Vous êtes maintenant connecté");
            //$this->redirect(array('action' =>'index' ));
        }else{
            echo ("Erreur de connexion, veuillez ressayer");
        }
bouks
Auteur

Finalement j'ai réussi, j'ai renommé ma fonction en "whatsup" et cela fonctionne... ( donc le code est correct )
Comme l'a dit Lartak problème logique au niveau de la terminologie de ma fonction....

Merci à tous pour m'avoir aidé