5

Je n'arrive pas à faire en sorte que le composant Auth effectue les redirections souhaitées dans une application CakePHP 1.2.6.Problème de redirection de composant CakePHP Auth

J'ai un formulaire de connexion qui apparaît sur toutes les pages et je veux garder l'utilisateur sur la page qu'il connecte. Par exemple, s'il consulte le profil d'un autre utilisateur, je souhaite qu'il reste à cet endroit après s'être connecté, sans le rediriger vers l'action $this->Auth->loginRedirect. Aussi, une autre chose à propos de mon application est que je n'ai pas de pages "accès authentifié seulement", chaque page est accessible à tous, mais si vous êtes connecté, vous obtenez des fonctionnalités supplémentaires.

Ce que je compris à la lecture du documentation est que je dois mettre autoRedirect à false pour obtenir le code dans la fonction login() à exécuter:

class UsersController extends AppController {  
    var $name = 'Users'; 
    var $helpers = array('Html', 'Form','Text'); 

    function beforeFilter() { 
     $this->Auth->autoRedirect = false; 
    } 

    function login() { 
     $this->redirect($this->referer()); 
    } 

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

    /* [...] */ 
} 

Ce casse actuellement mon authentification. J'ai remarqué (à partir des journaux) que si je laisse la redirection dans la fonction de connexion et définir autoRedirect à false, le champ de mot de passe dans $this->data dans la fonction login() apparaît comme vide.

Ci-dessous, j'ai posté le contenu de AppController qui se rapportent à la composante Auth:

public function beforeFilter() { 

    $this->Auth->fields = array(
     'username' => 'email',    
     'password' => 'password'    
    ); 

    $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');  
    $this->Auth->loginRedirect = array('controller' => 'usercars', 'action' => 'homepage'); 

    $this->allowAccess(); 

    // build wishlist if the user is logged in 
    if ($currentUser = $this->Auth->user()) { 
     $wishlists = $this->buildWishlist($currentUser); 
     $this->set('wishlists', $wishlists); 
    } 

} 

private function allowAccess() { 
     if(in_array($this->name, /* all my controller names */)) { 
      $this->Auth->allow('*'); 
     } 
} 

Je ne peux pas l'air de comprendre ce que je fais mal.

Répondre

10

Ajouter un parent :: beforeFilter(); à beforeFilter dans le contrôleur de l'utilisateur:

function beforeFilter() { 
    $this->Auth->autoRedirect = false; 
    parent::beforeFilter(); 
} 

Vous pouvez également remplacer la redirection avec ce à la méthode de connexion de votre contrôleur utilisateur:

$this->redirect($this->Auth->redirect()); 

Auth-> redirect() renvoie l'URL où l'utilisateur a atterri avant d'être redirigé vers la page de connexion ou Auth-> loginRedirect.

+0

Merci: D. Appeler le parent a complètement glissé mon esprit. –

0

Mettez ce code à votre contrôleur:

function beforeFilter() { 
    $this->Auth->allow('login', 'logout'); 
    $this->Auth->autoRedirect = false; 
    parent::beforeFilter(); 
} 

et, ajoutez la page de connexion:

function login() { 
    if($this->Auth->User()) { 
     $this->redirect(array('action'=>'welcome'), null, true); 
    } 
} 
Questions connexes