Pourquoi le composant d'authentification CakePHP ne hache-t-il pas mon mot de passe?
-
03-07-2019 - |
Question
J'utilise CakePHP 1.2 avec les composants Auth et ACL.
Dans mon action d’enregistrement d’utilisateur, le mot de passe arrive sans aucune haine. Plus précisément, cette expression:
if ($this->data['User']['password'] !=
$this->Auth->password($this->data['User']['confirm_password']))
Cela est évalué à vrai, même lorsque je soumets des valeurs identiques pour mot de passe
et mot_de_passe_confirmation
. Je sais que le mot de passe n'a pas été détruit, car lorsque je supprime l'appel de Auth- > password
, l'expression est évaluée à false.
Je m'attendais à ce que le module Auth hache automatiquement le mot de passe. Qu'est-ce que je fais mal?
Voici mon avis:
<?php
echo $form->create('User', array('action' => 'register'));
echo $form->input('email',
array('after' => $form->error(
'email_unique', 'This email is already registered.')));
echo $form->input('password');
echo $form->input('confirm_password', array('type' => 'password'));
echo $form->end('Register');
?>
Voici mon action de registre à partir du contrôleur d'utilisateur:
function register(){
if ($this->data) {
if ($this->data['User']['password'] !=
$this->Auth->password($this->data['User']['confirm_password'])) {
$this->Session->setFlash(__('Password and Confirm Password must match.', true));
$this->data['User']['password'] = '';
$this->data['User']['confirm_password'] = '';
}
else{
$this->User->create();
if ($this->User->save($this->data)){
$this->redirect(array('action' => 'index'), null, true);
}
else {
$this->data['User']['password'] = '';
$this->data['User']['confirm_password'] = '';
$this->Session->setFlash(__('Some problem saving your information.', true));
}
}
}
}
Et voici mon appController
dans lequel j'inclus les modules Auth
et Acl
:
class AppController extends Controller {
var $components = array('Acl', 'Auth');
function beforeFilter(){
if (isset($this->Auth)) {
$this->Auth->allow('display');
$this->Auth->fields =
array(
'username' => 'email',
'password' => 'password');
$this->Auth->authorize = 'actions';
}
}
}
Qu'est-ce que je fais de travers?
La solution
CakePHP ne hachera pas les mots de passe, à moins que le nom d'utilisateur ne contienne une valeur soumise. Je remplace le champ nom d'utilisateur par email. Cependant, j'ai remappé ces champs en définissant le tableau Auth- > fields. Cependant, je le faisais dans appController au lieu de userController. Alors déplacez cette ligne:
$this->Auth->fields = array('username' => 'email', 'password' => 'password');
hors de appController dans userController l'a résolu.
Maintenant, la question devient "Pourquoi ne puis-je pas réinitialiser les champs Auth- > dans appController?"
Autres conseils
Vous écrasez probablement AppController :: beforeFilter ()
avec votre UsersController :: beforeFilter ()
.
Pour "réparer" Pour cela, il suffit de mettre parent :: beforeFilter ()
au début de la fonction.
Vous devez hacher le mot de passe avant de sauvegarder dans la base de données. Placez cette fonction dans votre modèle utilisateur:
function beforeSave() {
if(isset($this->data[$this->alias]['password']))
$this->data[$this->alias]['password'] = Security::hash($this->data[$this->alias]['password'], null, true);
return true;
}
N'oubliez pas de mettre cela dans beforeFilter ()
dans le contrôleur de vos utilisateurs:
if(in_array($this->action, array('register'))) {
$this->Auth->fields = array('username' => 'email', 'password' => 'wrongfield');
}
Cela signifie que le mot de passe ne sera PAS haché lors de la procédure d'inscription (en cas d'échec de la validation du formulaire d'inscription).
Je pense que vous recherchez
hashPasswords ($data)
regardez ces pages. Ils devraient vous indiquer la bonne direction. Vous pouvez également essayer de changer votre niveau de débogage dans le fichier de configuration principal. le changer de 0 (production) à 3 vous permet de voir votre sortie SQL. peut être utile.
Désolé, je ne peux rien faire, mais vous diriger dans la bonne direction. Je suis nouveau sur Cakephp.