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!

25 réponses


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 */ 
    }
Lyks
Auteur

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.

Lyks
Auteur

Ca renvoie true pour :

debug(!$this->Auth->loggedIn());

et non pour :

debug($this->Auth->loggedIn());
Lyks
Auteur

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.

Lyks
Auteur

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 ?

Lyks
Auteur

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.

  • loginAction
    permet de définir l'action pour se connecter, dans ton cas tu n'as pas forcément besoin de le définir étant donné que tu utilises le controlleur et l'action par défaut de CakePHP pour la connexion.
  • loginRedirect
    permet de définir la redirection lié à l'action de connexion.
    Normalement, avec la condition que j'ai mise avec le loggedIn, ça n'autorise l'action que si l'utilisateur n'est pas déjà connecté sinon la page ne se charge pas et il est redirigé vers l'accueil.
    Donc logiquement, si tu ne peux pas utiliser le formulaire de connexion, c'est que tu es censé être déjà connecté.
Lyks
Auteur

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');

.

Lyks
Auteur

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'
            )
        )
    )
);
Lyks
Auteur

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 ;)

Lyks
Auteur

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 ?

Lyks
Auteur

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 ?

Tchoupi , j'ai répondu à ton sujet.

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'
                    )
                )
            )
        )
    );