Bonjour à tous, je rencontre un petit problème avec la fonction login. J'ai beau essayé de changer les paramètre au niveau du controller, il me retourne toujours false.
Le model : User.php

<?php
App::uses('SimplePasswordHasher', 'Controller/Component/Auth');
class User extends AppModel {
    public $name = 'User';
    public $belongsTo = array(
        'Role'
    );

    public $validate = array(
        'email' => array(
            'required' => array(
                'rule' => array('notEmpty'),
                'message' => 'Email required'
            ),
            array('rule' => 'isUnique', 'message' => 'This email exist in database')
        ),
        'password' => array(
            'required' => array(
                'rule' => array('notEmpty'),
                'message' => 'Password required'
            )
        ),
        'role' => array(
            'valid' => array(
                'rule' => array('notEmpty'),
                'message' => 'Role unvalid',
                'allowEmpty' => false
            )
        )
    );
    public function beforeSave($options = array()) {
        if (!empty($this->data'User']'password'])) {
            $passwordHasher = new SimplePasswordHasher(array('hashType' => 'sha256'));
            $this->data'User']'password'] = $passwordHasher->hash(
                $this->data'User']'password']
            );
        }
        return true;
    }
}
?>

L'app controller :

<?php
App::uses('Controller', 'Controller');
class AppController extends Controller {
    public $helpers = array('Text', 'Form', 'Html', 'Session');
    public $components = array(
        'Session',
        'Auth' => array(
            'loginRedirect' => array('controller' => 'users', 'action' => 'admin_index'),
            'logoutRedirect' => array('controller' => 'users', 'action' => 'login'),
            'loginAction' => array('controller' => 'users', 'action' => 'login'),
            'authenticate' => array(
                'Form' => array(
                    'userModel' => 'User',
                    'passwordHasher' => array(
                        'className' => 'Simple',
                        'hashType' => 'sha256'
                    ),
                    'fields'=> array('username'=>'username', 'password' => 'password')
                )
            )
        )
    );
    public function beforeFilter() {
        $this->Auth->allow('login', 'admin_ajouter', 'admin_index', 'admin_modifier', 'admin_voir', 'admin_supprimer');
    }
}

Et les fonctions de connection l'UsersController

public function admin_login() {
        if ($this->request->is('post')) {
            if ($this->Auth->login()) {
                $this->Session->setFlash(__('Logged'));
            } else {
                $this->Session->setFlash(__('No'.$this->Auth->user()));
            }
        }
        else{
            $this->Session->setFlash(__('Form normal'));
        }
        $view = "/pages/admin/User/login";
        $this->render($view);
    }
    public function admin_logout() {
        $this->Session->setFlash(__("You're disconnected"));
        $this->Auth->logout();
        return $this->redirect($this->referer());
    }

Au début je m'étais dit que balancer les données de formulaire dans la fonction fonctionnait, mais en faite ça log l'user avec les données qu'on envoie, ça fait pas de vérification si elle existe en base de données.

Si quelqu'un voit une cacahuète dans le code, je suis preneur, parce qu'avec la tête dans le guidon, j'ai du mal à voir le vélo maintenant.

Merci par avance de votre aide.

Nohman

12 réponses


Nohman
Auteur
Réponse acceptée

Non mais en fait, je suis un boulet, en gros le problème vient du fait que j'avais donnée une taille à mon champs password en BDD, et cette taille était trop courte par rapport à la taille du hash de cakephp, du coup c'était tronqué d'un caractère en BDD, rendant la comparaison avec le mot de passe rentré dans le formulaire caduc parce qu'il manquait le dernier caractère.

Merci, et désolé d'avoir gâcher votre temps.

Et en utilisant :
juste dans AppController:

public $components = array('Session', 'Auth');
    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->authenticate = array('Form');

Et dans UsersController

<u>$this->Auth->allow() autorise les actions sans besoin d'authentification</u>

public function beforeFilter() {
        $this->Auth->allow('admin_login', 'admin_logout');
}
public function admin_login() {
        if ($this->request->is('post')) {
            if ($this->Auth->login()) {
                $this->Session->setFlash(__('Logged'));
                $this->redirect(array('controller' => 'users', 'action' => 'admin_index'));
            } else {
                $this->Session->setFlash(__('No'.$this->Auth->user()));
            }
        }
    }

A tester ...

Nohman
Auteur

Je viens d'essayer et même résultat:

public function admin_login() {
        if ($this->request->is('post')) {
            $identified = $this->Auth->login();
            debug($identified);
            die();
            if ($identified) {
                $this->Session->setFlash(__('Logged'));
                $this->redirect(array('controller' => 'users', 'action' => 'admin_index'));
            } else {
                $this->Session->setFlash(__('No' . $this->Auth->user()));
            }
        }
        $view = "/pages/admin/User/login";
        $this->render($view);
    }

ça me retourne false, j'aurais dit y'a un problème de Hash, mais bon j'ai fait ce qui fallait comme sur la plupart des tutos.
je suis en sha256.

Nohman
Auteur

Je viens de faire un test. et le hashage du mot de passe est pas le problème, j'ai enlevé le hashage du mot de passe, essayé de me logger, mais c'est toujours à false.

A mon avis, peut être qu'il récupère pas les données.

tu peux mettre ta vue login ?

Nohman
Auteur
<h1>User Login Form</h1>
<?php
echo $this->Session->flash('auth');
echo $this->Session->flash();
echo $this->Form->create('User', array('controller' => 'users', 'action' => 'login'));
echo $this->Form->input('username', array('class' => 'form-control'));
echo $this->Form->input('password', array('type' => 'password', 'class' => 'form-control'));
echo $this->Form->submit('Login', array('class' => 'btn btn-success'));
echo $this->Form->end();
?>

c'est le truc tout con

Nohman
Auteur

Bon, j'ai réussi à afficher les requêtes et effectivement, il fait pas de vérif sur le mot de passe :

SELECT `User`.`id`, `User`.`username`, `User`.`firstname`, `User`.`lastname`, `User`.`email`, `User`.`password`, `User`.`role_id`, `Role`.`id`, `Role`.`name` FROM `insiteo_cake`.`users` AS `User` LEFT JOIN `insiteo_cake`.`roles` AS `Role` ON (`User`.`role_id` = `Role`.`id`) WHERE `User`.`username` = 'lhuguenot' LIMIT 1

Je vais continuer de chercher pour le forcer à prendre le mot de passe

Bonsoir Nohman,
As tu trouvé la solution à ton probleme? Je bloque sur le même point il me semble. si tu as des pistes je suis preneur! :)

Nohman
Auteur

Oui désolé, je pense que mon post était pas passé, alors en fait moi le problème venait de la taille de mon champs password en BDD qui était trop petit par rapport à la taille du mot de passe hasher.

Bonjour HELP HELP
Error: Class 'SimplePasswordHasher' not found

User.php
public function beforeSave($options = array()) {
if (isset($this->data$this->alias]'password'])) {
$passwordHasher = new SimplePasswordHasher();
$this->data$this->alias]'password'] = $passwordHasher->hash(
$this->data$this->alias]'password']
);
}
return true;

le probleme viens de cette ligne $passwordHasher = new SimplePasswordHasher();

Nohman
Auteur

tu as importer la class simplepasswordhasher ?

App::uses('SimplePasswordHasher', 'Controller/Component/Auth');

oui j'ai importé la class et pareil ça ne marché po..mai j'ai trouvé la solution .j'utilisé la version 2.3 et qaund j'ai comparé les nouvelle version ben ya SimplePasswordHasher.php donc j'ai copié ce fichier ainsi que AbstractPasswordHasher.php
du coup ca marche