Hashage mot de password

Par palmer08, il y a 14 ans


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, il y a 14 ans

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.