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{
}
}
}
}
?>
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.