2009-09-28 10 views
0

J'ai un simple formulaire de connexion, un nom d'utilisateur et un mot de passe. Fondamentalement, quand un utilisateur est n'importe où sur le site Web, il peut cliquer sur un lien qui l'amènera à la page de connexion. Après s'être connecté, il est redirigé vers la page d'où il est originaire.L'authentification CakePHP se casse après une connexion incorrecte

Le problème:

disons que je suis dans le «/messages » page et je clique pour ouvrir une session, alors maintenant je suis sur «/utilisateurs/login ». - si la connexion est correcte, ou la connexion est incorrecte et rien n'est rempli dans la zone de texte, tout fonctionne comme prévu (si c'est correct, je suis redirigé vers "/ posts" sinon je reçois le message "nom d'utilisateur ou mot de passe incorrect" , j'essaie de se connecter à nouveau correctement et je suis redirigé vers «/messages »;

  • si la connexion est incorrecte, et un texte est rempli dans la zone de texte Nom d'utilisateur, après la connexion je reçois le « mauvais nom d'utilisateur ou mot de passe ", ce qui est bon, mais si je remplis à nouveau le formulaire, peu importe si c'est correct ou non, je reçois" Vous n'êtes pas autorisé à accéder à cet emplacement ". Si j'essaie de me connecter pour la troisième fois, login fonctionne, mais je suis redirigé vers "/ users/posts" au lieu de "/ posts" (la valeur de la page de redirection, qui est stockée dans une session, est encore l "/ messages").

Voici le code:

function beforeFilter() { 
     parent::beforeFilter(); 
     $this->Auth->allowedActions = array('confirmation'); 

     $this->Auth->fields = array(
      'username' => 'usr_username', 
      'password' => 'usr_password' 
     ); 
     $this->Auth->userScope = array('User.usr_confirmed' => 1); 

     if($this->action == 'signup') { 
      $this->Auth->authenticate = $this->User; 
     } 
    } 

function login() { 
    if ($this->Auth->user()) { 
     $this->redirect($this->Session->read('page')); 
     exit(); 
    } 
} 

function logout() { 
    $this->Session->destroy('username'); 
    $this->redirect('/'); 
    exit(); 
} 

Répondre

0

il semble que votre action forme redirigeant vers une zone restreinte. vérifiez l'attribut d'action de formulaire.

+0

Merci pour la réponse rapide. Mon action de formulaire pointe vers/user/login, qui n'est pas limité. C'est étrange, si j'imprime le contenu de $ this-> data ['User'], il est vide après le second login (quand le message "Vous n'êtes pas autorisé ..." apparaît). –

+0

peut-être nous montrer le fichier de vue. ça pourrait aider –

+0

Ah, vous aviez raison en fait ..J'avais $ form-> create ('User', array ('action' => 'login')), et quand je l'ai remplacé par $ form-> create (null, array ('url' => '/ users/login ')) cela a fonctionné .. Je pensais que les deux signifiaient la même chose .. –

0

Mettre cela au bas de app/views/layouts/default.ctp pour aider déboguer la session:

<?php debug($session->read()); ?> 

La clé Auth.User sera rempli de données lorsque vous êtes connecté, mais, plus important encore, la clé Auth.redirect sera contenant l'URL de la dernière page restreinte visitée,

Etes-vous en train de stocker l'URL d'une page restreinte dans la clé page de votre session?

Si oui, AuthComponent peut fournir cette fonctionnalité déjà avec sa clé Auth.redirect. Tout ce que vous devez faire est de créer un lien vers la page restreinte au lieu de la page de connexion et AuthComponent remplira automatiquement cette clé et traitera la redirection après la connexion.

echo $html->link('Login', array('controller' => 'users', 'action' => 'profile')); 

Sinon, pourquoi ne pas envisager de remplir cette clé à la place. Puisque AuthComponent vérifie déjà et agit sur cette touche, vous pouvez obtenir des fonctionnalités gratuites.

En tout état de cause, voici ce qu'une méthode personnalisée login devrait ressembler dans votre cas, mais si l'un des conseils ci-dessus fonctionnera alors vous pouvez simplement laisser la méthode login tous ensemble et utiliser la fonctionnalité par défaut:

function login() { 
    // log the user in 
    if ($this->Auth->login()) { 
     // your session redirect 
     if ($this->Session->read('page')) { 
      $this->redirect($this->Session->read('page')); 
     } 
     // auth's session redirect 
     if ($this->Session->read('Auth.redirect')) { 
      $this->redirect($this->Session->read('Auth.redirect')); 
     } 
     // default redirect 
     $this->redirect($this->Auth->loginRedirect); 
    } 
} 
Questions connexes