Salut à tous,
Voila je suis entrain de crée un petit site avec cakephp, et je souhaiterais ajouter au moment de la connexion d'un utilisateur la case se souvenir de moi.
Je précise que le module user marche très bien sans cette option.
Mais il me sort une erreur sur toutes mes pages que j'ai du mal à comprendre vu qu'il est déclarer et marchais avant
FATAL ERROR: CLASS 'AUTHCOMPONENT' NOT FOUND
j'ai donc redeclarer auth :
App::uses('AuthComponent', 'Controller/Component');
mais sa change rien et j'avoue que je bloque un peu.
Quelqu'un aurais t'il une idée ?
(J'ai la version 2.4.1 de cakephp)
Voici se que j'ai crée :
Dans mon AppController
public $helpers = array('Html','Text','Form','Session','Cache','Media.Media');
public $components = array('Security','RequestHandler','Session','Cookie',
'Auth' => array(
'authenticate' => array(
'Form' => array(
'scope' => array('User.active' => 1)
)
)
)
);
public function beforeFilter() {
$this->Cookie->httpOnly = true;//options du cookie
//si l'utilisateur est connecter
if (!$this->Auth->loggedIn() && $this->Cookie->read('rememberMe')) {
$cookie = $this->Cookie->read('rememberMe');
$this->loadModel('User');//je charge le model
$user = $this->User->find('first', array(
'conditions' => array('User.username' => $cookie'username'],'User.password' => $cookie'password'])
));
//si l'utisateur est different de la demande
if ($user && !$this->Auth->login($user'User'])) {
$this->redirect(array('action'=>'logout','controller'=>'users'));
}
}
}
Dans mon fichier core j'ai ajouter cookietimeout à 0
Configure::write('Session', array(
'defaults' => 'php',
'cookieTimeout' => 0
));
La checkbox dans mon formulaire de connexion
<?php echo $this->Form->input('rememberMe', array('type' => 'checkbox', 'label' => 'Se souvenir de moi')); ?>
Et dans mon controller User j'ai ajouter dans la fonction login
if ($this->Auth->login()) {
$this->User->id = $this->Auth->user("id");
if ($this->request->data'User']'rememberMe'] == 1) {
$cookieTime = "+1 week"; // Durée de vie du cookie
// destruction des infos de la checkbox
unset($this->request->data'User']'rememberMe']);
// On hash le mot de passe
$this->request->data'User']'password'] = $this->Auth->password($this->request->data'User']'password']);
// jecris dans le cookie
$this->Cookie->write('rememberMe', $this->request->data'User'], true, $cookieTime);
}
....
}
Merci d'avance
Tu ne fais toujours pas la connexion de l'utilisateur quand tu vérifies la présence du cookie chez l'utilisateur.
Tu as la connexion habituelle via le formulaire de connexion, mais pas l'auto connexion à travers la connexion persistante dans le beforeFilter de ton AppController.
Une fois que tu as fait tes vérifications et actions dans le beforeFilter de l'AppController, tu ajoutes à la fin :
$this->Auth->login($user'User']);
Si tu ne fais pas ça, tu auras fait tes vérifications sur l'existence du cookie et donc de la demande de la connexion persistante par l'utilisateur, mais si tu ne le connecte pas toi même et qu'il doit le faire lui même, ça n'aura servi à rien.
Quand l'utilisateur demande à avoir une connexion persistante sur ton site mais qu'il doit se connecter à chaque fois, il n'aura aucun intérêt à en faire la demande.
Donc il faut que tu fasse comme ça par exemple :
public function beforeFilter(){
if (!$this->Auth->loggedIn() && $this->Cookie->read('rememberMe')) {
$cookie = $this->Cookie->read('rememberMe');
$user = $this->User->find('first', array(
'conditions' => array('User.username' => $cookie'username'],'User.password' => $cookie'password']),
'fields' => array('User.username','User.password')
));
$user'password'] = $this->Auth->password($user'password']);
$this->Cookie->write('rememberMe', $user, true, "+1 week");
/ **ceci en plus** /
$this->Auth->login($user'User']);
/ **fin** /
}
Bonsoir <u><strong>tribal</strong></u>.
Il y a une chose que je ne comprend pas.
Soit tu t'es trompé dans tes commentaires ou alors dans ta logique, car en commentaire tu dis
//si l'utilisateur est connecter
donc dans le cas ou l'utilisateur est connecté, alors que dans la logique
!$this->Auth->loggedIn()
, tu vérifies donc si l'utilisateur n'est pas connecté.
Ensuite dans ta logique, je ne vois pas à quel moment tu le connecte l'utilisateur, car même quand tu vérifies si l'utilisateur n'est pas connecté et s'il a le Cookie de connexion persistante, tu ne fais aucune action pour le connecter par la suite.
Pour terminer, je ne comprends pas pourquoi tu veux déconnecter un utilisateur alors qu'il n'est pas connecté dans ton :
if ($user && !$this->Auth->login($user'User'])) {
$this->redirect(array('action'=>'logout','controller'=>'users'));
}
.Ce n'est pas logique de vouloir déconnecter un utilisateur s'il n'est même pas connecté.
Pour conclure, ça ne sert à rien de vouloir déclarer à nouveau le composant Auth, alors que tu l'as déjà déclaré dans le AppController et que tu t'y trouve en plus.
Tu as du faire une erreur autre part où tu as appelé le composant Auth.
Bon j'ai trouver mon ereur en faites dans mon app controlelr j'avais un deuxieme beforefilter en bas de la page.
Et en plus comme tu la dit c'etais pas logique se que j'avais fait.
Maintenant tous fonctionne mais j'ai l'impression de faire une erreur !!!!!
Voici mon code final :
dans mon Usercontroller la function login
public function login(){
if (!empty($this->request->data)) {
if ($this->Auth->login()) {
$this->User->id = $this->Auth->user("id");
if ($this->request->data'User']'rememberMe'] == 1) {
$cookieTime = "+1 week"; // Durée de vie du cookie
// destruction des infos de la checkbox
unset($this->request->data'User']'rememberMe']);
// On hash le mot de passe
$this->request->data'User']'password'] = $this->Auth->password($this->request->data'User']'password']);
// jecris dans le cookie
$this->Cookie->write('rememberMe', $this->request->data'User'], true, $cookieTime);
}
$this->Session->setFlash("Vous êtes maintenant connecté","warning",array('type'=>'success'));
$this->redirect(array('action'=>'index','controller'=>'users','membre'=>true));
}else{
$this->Session->setFlash("Identifiants incorrects","warning", array('type' => 'error'));
}
}
}
Et dans mon APPController
public $components = array('Security','RequestHandler','Session','Cookie',
'Auth' => array(
'authenticate' => array(
'Form' => array(
'scope' => array('User.active' => 1)
)
)
)
);
function beforeFilter(){
if (!$this->Auth->loggedIn() && $this->Cookie->read('rememberMe')) {
$cookie = $this->Cookie->read('rememberMe');
$user = $this->User->find('first', array(
'conditions' => array('User.username' => $cookie'username'],'User.password' => $cookie'password']),
'fields' => array('User.username','User.password')
));
$user'password'] = $this->Auth->password($user'password']);
$this->Cookie->write('rememberMe', $user, true, "+1 week");
}
}
Je n'arrive pas à comprendre bien se que tu me dit.
Il faut que je refasse un $this->Auth->login(); apres la verif dans la table c'est sa ?
ok c'etais sa j'ai pige c tous con je comprend pas pourquoi j'ai bloque la dessus.
Merci lartak
De rien, avec plaisir.
Il te faut peut-être ajouter un
$this->redirect($this->referer());
À toi de voir avec tes tests, à mettre bien sur après l'auto-connexion de l'utilisateur.