Bonjour à tous et merci de votre aide.
J'ai parcouru un millier de post à ce sujet et je ne trouve pas la soluction à mon probléme.

UsersController.php

    public function login() {
        if ($this->request->is('post')) {
            if ($this->Auth->login()) {
                return $this->redirect($this->Auth->redirectUrl());
            } else {
                $this->Session->setFlash(__('Votre nom d\'user ou mot de passe sont incorrects.'));
            }
        }
    }

User.php

    public function beforeSave($options = array()) {
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
        return true;
    }

AppController

    public $components = array(
        'Acl',
        'Auth' => array(
            'authorize' => array(
                'Actions' => array('actionPath' => 'controllers')
            ),
            'flash' => array()
        ),
        'Session',
        'DebugKit.Toolbar'
    );

debug($this->request->data);

    'User' => array(
        'password' => '*****',
        'username' => 'test'
    )

Merci à vous

6 réponses


Majid Cameleon
Auteur
Réponse acceptée

Merci Lartak de ton aide, j'ai trouvé la source de mon probléme.
Alors ne faite pas comme moi lol

Lors de l'ajout d'un utilisateur, j’appelais la fonction $this->Auth->password() dans mon UsersController.
Et une fois encore dans mon beforeSave() du modéle User.
Forcement ça ne marchera pas, si je hash deux fois le code.

Bonjour.
La première chose qui ne va pas, c'est dans ton modèle, dans la fonction beforeSave.
Tu dois d'abord vérifier que la clé password est présente lors d'une sauvegarde et tu ne dois pas utiliser le composant Auth dans un modèle, si tu regardes dans l'un des tutoriels de la documentation de CakePHP, voici ce qu'ils montrent :

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

class User extends AppModel {

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

Si à la création de l'utilisateur le mot de passe n'est pas crypté, ce n'est pas étonnant qu'il ne puisse pas se connecter.
Ce qui aurait pu nous être utile comme information, c'est à quel moment tu fais le debug.
Ensuite, est-ce que tu utilises les ACL ?
Pour utiliser comme configuration d'autorisation :

'authorize' => array(
    'Actions' => array('actionPath' => 'controllers')
/* ... */

Pour rappel :

actionPath Utilisé par ActionsAuthorize pour localiser le controller action ACO’s dans l’arborescence ACO.

Merci Lartak, ta réputation te précede j'ai lu toute tes soluce sur ce forum.

Oui, le codes sont hasher et c'est fonctionnel.
Le code a été repris sur le tuto des ACL sur le site CakePHP.
Histoire de partir sur les même base j'ai repris ton code beforeSave().

Oui, les ACL sont utilisés.

UsersController, j'ai soulever toutes les restrictions pour le debug.

    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow();
    }

Console

cake acl check regulars Users/login
regulars is allowed.

Par contre j'ai ceci en session avec DebugKit

Session > Message > auth > message : You are not authorized to access that location.

Merci à toi

Le message dit clairement que tu n'es pas autorisé à accéder à la page demandée.
À quelle page essaies tu d'accéder quand tu as le message d'erreur ?
Je suppose également que lorsque tu tentes de te connecter, tu dois avoir ton message d'erreur (Votre nom d\'user ou mot de passe sont incorrects.), et que par conséquent, tu n'es a aucun moment connecté.

    public function beforeFilter() {

        //Configure AuthComponent
        $this->Auth->loginAction = array(
            'controller' => 'users',
            'action' => 'login'
        );
        $this->Auth->logoutRedirect = array(
            'controller' => 'pages',
            'action' => 'display'
        );
        $this->Auth->loginRedirect = array(
            'controller' => 'pages',
            'action' => 'display'
        );

Et les ACL sont permis pour le controller Pages

C'est suffisant pour désactiver les ACL ?
Histoire d'isoler Auth et de mieux cibler le probléme.

public $components = array(
        //'Acl',
        'Session',
        'Auth' => array(
            'authenticate' => array(
                'Form' => array(
                    'passwordHasher' => array(
                        'className' => 'Simple',
                        'hashType' => 'sha256'
                    )
                )
            ),
            'authorize' => array(
                //'Actions' => array('actionPath' => 'controllers'),
                'loginAction' => array('controller' => 'users', 'action' => 'login'),
                'logoutRedirect' => array('controller' => 'pages', 'action' => 'display'),
                'loginRedirect' => array('controller' => 'pages', 'action' => 'display'),
                'unauthorizedRedirect' => array('controller' => 'pages', 'action' => 'display')
            ),
            'flash' => array()
        ),
        'DebugKit.Toolbar'
    );

PS J'ai changer le hasthType

if (!empty($this->data[$this->alias]['password'])) {
            $passwordHasher = new SimplePasswordHasher(array('hashType' => 'sha256'));