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?

Était-ce utile?

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.

Méthodes AuthComponent

Dépannage de Cakephp

Désolé, je ne peux rien faire, mais vous diriger dans la bonne direction. Je suis nouveau sur Cakephp.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top