Bonsoir,

Je rencontre un problème étrange que je n'arrive pas à résoudre sous CakePHP 2.0.
Quand on enregistre un utilisateur, nous sommes obligés de hasher le mot de passe manuellement et c'est à ce stade que ce rencontre mon soumis. CakePHP laisse le mot de passe tels quelle.

AppController.php

<?php
class AppController extends Controller{

    public $components = array('Auth');
}
?>

User.php

<?php
class User extends AppModel{
    public $validate = array(
        'username' => array(
            'isUnique' => array(
                'rule' => 'isUnique',
                'required' => true,
                'allowEmpty' => false,
                'message' => 'This username is not available'
            ),
            'between' => array(
                'rule' => array('between', 4, 30),
                'message' => 'The username must be between 4 and 30 characters'
            ),
        ),
        'password' => array(
            'alphaNumeric' => array(
                'rule' => 'alphaNumeric',
                'required' => true,
                'allowEmpty' => false,
                'message' => 'The password must contain letters and numbers only'
            ),
            'between' => array(
                'rule' => array('between', 8, 30),
                'message' => 'The password must be between 8 and 30 characters'
            ),
        ),
        'email' => array(
            'rule' => array('email', true),
            'required' => true,
            'allowEmpty' => false,
            'message' => 'You must enter a valid email'
        ),
        'avatar' => array(
            'rule' => array('url', true),
            'required' => true,
            'allowEmpty' => false,
            'message' => 'You must enter a valid url'
        ),
    );
    public function beforeSave(){

        $this->data'User']'password'] = AuthComponent::password($this->data'User']'password']);
        $this->data'User']'password_confirm'] = AuthComponent::password($this->data'User']'password_confirm']);
        return true;
    }
}
?>

UsersController.php

<?php
class UsersController extends AppController{
    public $components = array('Session');

    public function beforeFilter(){

        $this->Auth->allow('register');
    }
    public function register(){

        $this->set('title_for_layout', 'Register');
        $this->set('active', 'register');
        $this->User->set($this->data);
        if($this->request->is('post')){

            if($this->User->validates()){

                if($this->request->data'User']'password'] == $this->request->data'User']'password_confirm']){

                    debug($this->data);
                }else{

                    $this->Session->setFlash('Password doesn\'t match', 'default', array(), 'password');
                }
            }else{

            }
        }
    }
}
?>

1 réponse


slyvaan
Réponse acceptée

Tu as mis le hash dans le beforeSave mais tu ne sauvegarde l'utilisateur nulle part, il faut que tu appelles la method save() pour que ton beforeSave marche.

Grosso-modo comme ça :

<?php

class UsersController extends AppController{

    public $components = array('Session');

    public function beforeFilter(){

        $this->Auth->allow('register');

    }

    public function register(){

        $this->set('title_for_layout', 'Register');
        $this->set('active', 'register');

        $this->User->set($this->data);

        if($this->request->is('post')){

            if($this->User->validates()){

                if($this->request->data'User']'password'] == $this->request->data'User']'password_confirm']){
                    // On sauvegarde quand même pour que le beforeSave fonctionne 
                    if($this->User->save($this->request->data))
                    {
                         $this->Session->setFlash('Utilisateur sauvegardé');
                    }

                }else{

                    $this->Session->setFlash('Password doesn\'t match', 'default', array(), 'password');

                }

            }else{

            }

        }

    }

}

?>

Et la si tu regardes ta base, tu verras que ton utilisateur aura son mot de pass hashé sauvegardé.

PS: je te déconseille de fermer le tag php en bas des pages "?>" ça apporte quelques erreurs sur certains frameworks et certains scripts.