Bonsoir
Je suis lee tuto jours 4 et à 10:30 de la vidéo je n'ai pas la même requête que monsieur l'auteur pour une raison totalement inconnue ! Cela fait 2h que j'arpente tous les thread de stackoverflows et j'en passe ...
Mon code est bon, j'ai même resuivi la vidéo pour revérifier avec lettre par lettre.. limite. Seul ma version de CakePHP peut être différente. Mais je n'ai pas pris la toute dernière! Et je crois même avoir fait exprès de prendre la même version que l'auteur du tutoriel.
SELECT `User`.`id`, `User`.`username`, `User`.`password`, `User`.`role` FROM `mabase`.`users` AS `User` WHERE `User`.`username` = 'admin' LIMIT
comme on peut le constater, il manque la requête à la fin : AND 'User'.'password' = 'admin'
en gros rien ne fonctionne et je ne peux pas continuer le tutoriel car la méthode login() ne semble pas fonctionner de la même façon...
Merci beaucoup pour l'éventuelle aide tant espérée!
Bonsoir.
Normalement tu as juste à mettre quelque chose comme ça dans ta fonction login :
public function login(){
if(!$this->Auth->loggedIn()){ /* Si l'utilisateur n'est pas déjà connecté ... */
if($this->request->is('post')){ /* La requête a bien été envoyé en post on tente la connexion */
if($this->Auth->login()){ /* La connexion s'est bien effectuée */
/* Message de succès */
return $this->redirect($this->Auth->redirect()); /* redirection vers l'action si tu l'a définie */
/* Si tu as défini une redirection après la connexion dans le composant Auth, sinon */
return $this->redirect('/'); /* Sinon tu mets la redirection vers l'accueil du site ou tu en mets une autre */
} else { /* La connexion ne s'est pas effectuée, tu peux enlever cette partie si tu ne veux pas transmettre de message d'erreur */
/* Message d'erreur */
}
}
}
return $this->redirect('/'); /* L'utilisateur est déjà connecté, on stoppe l'action et le redirige vers l'accueil du site */
}
Merci Lartak11.
J'ai essayé ton code, et je ne comprends pas !
Bon déjà, si je vais sur le prefix "admin" je retourne direct à la racine, en gros il ignore le formulaire et fait la redirection à la racine car rien n'a été posté...
Ce qui est bien vrai puisque si je fais un debug(!$this->Auth->loggedIn()); il me renvoie true.
Sauf qu'avec ton code je peux même pas envoyer le formulaire!
En enlevant le dernier return que tu m'as proposé j'ai accès au formulaire (users/login) mais tjrs le même problème :
quand je le valide la requête n'est pas complète, il compare que l'username et pas le password... alors que d'après le tuto, non seulement il compare aussi le password mais en plus CakePHP hash directement celui-ci par défaut!
C'est que tu es déjà connecté alors, si ma vérification de connexion retourne true et que tu ne peux pas envoyer ton formulaire.
C'est donc normal qu'il ne te reconnecte pas.
Tu dois remettre ce que j'ai mis et te déconnecter avant de valider le formulaire.
$this->Auth->loggedIn() , veut dire en gros "L'utilisateur est connecté", donc en lui disant "!" (différent) je lui passe en condition "Si l'utilisateur n'est pas connecté" ça autorise l'action en gros et ne le redirige pas.
Car CakePHP ne vas pas reconnecter un utilisateur déjà connecté, ce qui est logique.
Donc en mettant cette condition, ça lui évite des manipulations supplémentaires.
Ca renvoie true pour :
debug(!$this->Auth->loggedIn());
et non pour :
debug($this->Auth->loggedIn());
Voici mon login.ctp dans ma Vue :
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('username'); ?>
<?php echo $this->Form->input('password'); ?>
<?php echo $this->Form->end('Se connecter'); ?>
J'ai un petit doute.. Quand je créais le formulaire je mets create('User') mais ne serait-ce pas plutôt 'Users' ?
Mon controller est UsersController et ma table est 'users'. Du coup mes input ont dans l'attribut name "data[User][username]".
Mais quel est cet 'User' je vois pas la correspondance. :/
Merci
Non, c'est bien le nom du modèle, qui est User.
Quand tu fais un create pour un formulaire, tu mets le nom du modèle correspondant en 1er argument.
Mais je n'ai aucun model User ...
(:honte: mais en même temps j'ai suivi à la lettre la vidéo et on a pas les mêmes résultats ! il n'arrive pas encore à se connecter mais il récupère dans sa requête sql le mot de passe hashé qu'il envoie au formulaire)
Je t'ai rajouté des commentaires dans le code que j'ai mis plus haut pour que tu comprennes mieux la "logique" des vérifications.
Ce n'est pas grave, ce n'est pas obligatoire si tu ne veux pas faire de vérification particulière et si tu n'as pas de liaison à définir avec une autre table, pour lui ça veut juste dire que le formulaire est lié avec ta table users en gros.
Ce qui m'étonne, c'est que d'après ce que je m'en souvient, Grafikart fait des règles de validation dans le tutoriel, il le fait tout le temps d'ailleurs à principe.
Mais si tu fais un système d'identification pour des membres, je te conseille de créer un modèle User et d'y faire des règles de validations.
Tu as bien défini ton système d'authentification dans le composant Auth ?
Ah d'accord! Merci :)
Oui comme on peut le voir dans mon beforeFilter-)
$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login', 'admin' => false);
if(!isset($this->request->params'prefix'])) { // Si le prefix n'est pas défini
$this->Auth->allow(); // Donne les droits d'accès à tous le site
}
En fait, Grafikart le fait sûrement, mais je me suis arrêté à 10:34 du tuto, là où je bloque : youtube.com/watch?v=nGtaDQ42Mxk
P.S: pour les commentaires, j'avais compris. En gros avec un debug(!$this->Auth->loggedIn()); ça renvoie true. Alors soit j'ai complètement pété un boulon, soit c'est que ça veut dire que je ne suis pas déjà connecté.. (et que donc il devrait m'afficher le formulaire avec ton code).
On avance.. on va peut-être y arriver :p mais déjà je comprends mieux les choses, c'est positif ! merci vraiment
loginAction c'est différent de loginRedirect.
Je pense que Grafikart a mit loginAction car je vais en avoir besoin par la suite du tutoriel.
Ce que tu dis est totalement logique ! Ce qui ne l'est pas c'est qu'il skip le formulaire mais que si je fais un return debug à la fin il me renvoie True.. ça n'a aucun sens
EDIT : J'ai fait ce test
public function login(){
if(!$this->Auth->loggedIn()){
if($this->request->is('post')){
if($this->Auth->login()){
$this->Session->setFlash("VOUS ETES CONNECTE", 'notif');
return $this->redirect($this->Auth->redirect());
} else {
$this->Session->setFlash("ERREUR", 'notif');
}
} else {
return $this->redirect('/DSQDQD');
}
}
return $this->redirect('/');
}
Cela prouve bien que je ne suis pas connecté car je suis redirigé vers /DSQDQD et qu'aucune donnée n'ont été envoyée depuis le formulaire.. ce qui est normal puisque je ne l'ai même pas reçu ! Mais pourquoi? Pourquoi n'ai-je pas le formulaire avec ton code alors qu'avec celui d'origine, si.
Tu as forcément accès au formulaire puisque tu es redirigé vers /DSQDQD, par contre, tes données ne sont pas transmises à priori.
Par contre, n'utilises pas $this->Auth->redirect(), vu que tu ne l'as pas défini, ou alors rajoutes ceci dans le composant Auth
'loginRedirect' => array('controller' => 'posts', 'action' => 'index')/* Tu mets ou tu veux rediriger l'utilisateur après la connexion */
C'est quand même étonnant qu'il ne te connecte pas, mais à mon avis, comme il ne trouve pas le loginRedirect, il passe à l'accolade suivante, qui donne
return $this->redirect('/DSQDQD');
.
En fait j'ai fait ça pour qu'il me redirige sur la page qui était demandée avant, après la connexion. Ex: je suis déconnecté, j'essaye d'accéder au prefix admin (ex: /admin/posts), ça refuse et ça m'envoie sur users/login pour que je me co, donc je me co et ça me redirige sur la page que j'avais tenté d'accéder (/admin/posts). Bon en tout cas si j'entre 'admin' en username il trouve bien 'admin' dans ma table 'users'. Mais il ne cherche **toujours** pas le mot de passe comme dans la vidéo du tutoriel... [url=http://zupimages.net/up/14/07/pwoh.png]VOIR ENTIEREMENT L'IMAGE[/url] [url=http://zupimages.net/viewer.php?id=14/07/pwoh.png][img]http://zupimages.net/up/14/07/pwoh.png[/img][/url]
Je dirais tout simplement que tu n'as pas défini le type d'authentification dans ton composant Auth (public $components).
Tu as défini l'action de connexion, mais pas le type d'authentification à mon avis, c'est pour ça qu'il ne cible que le username.
public $components = array(
'Auth' => array(
'authenticate' => array(
'Form'
)
)
)
);
Rien n'a changé... Je pense que CakePHP a du bien changé depuis par rapport à la version utilisée dans le tuto
Edit : J'ai tout refait avec la doc http://book.cakephp.org/2.0/fr/tutorials-and-examples/blog-auth-example/auth.html
Le résultat est le même. Alors j'ai tendance à penser que le problème vient d'autre part...
Je viens de poster un sujet similaire, j'ai le même problème ...
Je ne comprends vraiment pas d'où vient le problème.
Si jamais tu as trouvée une solution, fais moi signe ;)
Salut Tchoupi!
Alors je n'ai pas réussi à résoudre le problème à sa source, tu te doutes bien que, sinon, j'aurais partagé la solution. ;-)
Je t'invite à lire ce topic si ce n'est pas déjà fait, il n'y a pas la solution mais ... http://www.grafikart.fr/forum/topic/12019
Pour ma part, comme dit dans le topic si dessus, je suis reparti sur des bases saines avec cakePHP 2.4 et j'ai monté le projet avec ce que j'avais appris durant les tuto. Bizarrement, tout fonctionnait.
Donc je t'invite (décidément ça fait beaucoup d'invitations :D) à ne pas rester bloquer sur ce problème et de le surmonter de la même façon que moi.
Donc si j'ai bien compris, le problème avec le password, c'est qu'il ne le gère plus comme les anciennes versions de CakePhp ?
Je pense oui. Car même en ayant suivant à la lettre l'aide de la doc pour le composant Auth ça ne fonctionne pas.
Ce qui est anormal.. puisque à priori il se doit être maintenu à jour, ou du moins compatible pour toutes les versions 2.x
Je suis de même avec la version 2.4.5, mais je malheureusement ne je trouve pas la solution ..., une des seuls solutions je penses est de reprendre une ancienne version de cakephp mais ce qui, niveau sécurité n'est pas trop recommandé...
Bonjour,
C'est bizarre car moi je suis en 2.4.5 pour mon projet et l'authentification marche super bien. J'ai repris le code de notre formateur préféré et modifier pour que le comportement colle parfaitement avec mon projet.
Cordialement
Bizarre...
Moi impossible.
Pourrais-tu nous faire voir ton code côté controller et view si tu veux bien ?
Bonjour,
Je relance ce topic car j'ai le même problème.
Moi j'ai commencé le tuto avec la version 2.4.6 de cakephp, jusqu'ici tout va bien sauf le composant auth qui ne réagit pas comme dans la vidéo, c'est-à-dire que la requête se fait sans le password, alors j'ai cherché dans la doc et un peu partout sur le net, j'ai essayé quelques trucs, mais j'en suis toujours au même résultat.
Le problème est que le composant auth ignore le password lors du post. Personnellement je ne me renvoie pas recommencer le tuto avec une version antérieure, le but c'est aussi d'apprendre et de s'adapter. Je vais continuer de chercher, car ça me rend fou depuis 6h que je bloque sur ça. Si quelqu'un à une explication sur ce problème, merci de bien vouloir la partager.
Bon j'ai finalement compris, en fait le composant prend bien en compte le password lors de la requête mais sql_dump ne l'affiche plus (par sécurité). Pour voir que cela fonctionne il suffit de créer un compte manuellement avec le password crypté (logique).
J'ai mis ceci dans l'action login pour récupérer la valeur crypté du mot de passe nécessaire à la création de mon compte utilisateur de test.
function login(){
if($this->request->is('post')){
echo $this->Auth->password('mon_pass'); die();
if($this->Auth->login()){
return $this->redirect(array('controller' => 'pages', 'action' => 'index', 'admin' => true));
}else{
$this->Session->setFlash("Votre email ou votre mot de passe ne correspond pas","notif",array('type'=>'danger'));
}
}
}
Ensuite il suffit de copier le mot de passe dans la base.
J'ai aussi ajouté le code ci-dessous dans UsersController pour remplacer username par email et biensur ajouté un champ email dans la tables users :
public $components = array(
'Auth' => array(
'authenticate' => array(
'Form' => array(
'fields' => array(
'username' => 'email',
'password' => 'password'
)
)
)
)
);