Bonjour à tous,

Je pensais régler ce problème en 2 minutes mais non.
Jusqu'à maintenant je ne controlais pas le mot de passe ou son changement.

Je m'y attaque et j'ai mis une nouvelle regle de validation ainsi

Dans mon modele user.php
j'ai cette fonction

public function checkPassword($check){
        $ko = '/^\da-xA-Z]/';
        $ok = '/^(?=.*\d)(?=.*[a-x])(?=.*[A-Z]).{6,10}$/';
        debug($check);
        debug($check);
        debug(is_string($check));
        if( !preg_match($ko, $check) and preg_match($ok, $check) ){
            return true;
        }else{
            return false;
        }
    }

et cette relgle de valilation

..]
'password'  => array(
            array(
                'rule' =>'notEmpty',
                'allowEmpty'=> false,
                'message'   => "Le mot de passe est obligatoire"
            ),
                'rule' => 'checkPassword',
                'message'   =>'Le mot de passe doit contenir au moins une majuscule et un chiffre. Il doit aussi avoir entre 6 et 10 caractères'
            ),
...]

Le problème qui se pose, c'est que ma fonction preg_match()

if( !preg_match($ko, $check) and preg_match($ok, $check) ){

me retourne une erreur, car la variable $check n'est pas une tring

et ceci

debug(is_string($check));

me retourne false
et

debug($check);

me retourne des étoiles.

Je pense que c'est parce que le mot de passe est déjà haché, non?

Avez-vous une idée comment résoudre ce problème?

Pour information, je hache mon mot de passe juste avant de sauver. Soit dans le modele user.php, j'ai cette fonction

function beforeSave($options = array()){
        // Si
        if(!empty($this->data'User']'password'])){
            // Encrypt password
            $this->data'User']'password'] = AuthComponent::password($this->data'User']'password']);
            //$this->data'User']'password'] = Security::hash($this->data'User']'password']);
            return true;    
        }
// return true;
    }

Es-ce que je vous donne assez d'information?
Avez vous une idée qui m'aiderait?

Milles mercis

5 réponses


pierrot10
Auteur
Réponse acceptée

Mais oui, il y avait ca

'rule' => array('between', 6, 10)

Grrrr.

Merci de m'avoir remis sur le bon chemin et pourquoi je me complique la vie.
Voici le résultat:

'password'  => array(
            array(
                'rule' =>'notEmpty',
                'allowEmpty'=> false,
                'message'   => "Le mot de passe est obligatoire"
            ),
            array(
                'rule' => array('between', 6, 10),
                'message'   =>'Le mot de passe doit avoir entre 6 et 10 caractères'
            ),
            array(
                'rule' => '/^(?=.*\d)(?=.*[a-x])(?=.*[A-Z]).*$/', // Controle si au moin 1 chiffre et 1 mujuscule
                'message'   =>'Le mot de passe doit contenir au moins une majuscule et un chiffre.'
            )
        ),

Merci Lartak11

Je ne comprend pas ce que tu cherches à faire avec ton checkPassword.
Tu cherches à faire une validation juste d'après une chaîne de caractères ou en comparent deux champs mot de passe ?

Non je cherche a verifier le mot de passe qui doit avoir

  1. Entre 6 et 10 caracteres
  2. Min. 1 Majuscule
  3. Min. 1 chiffre

La condition regex fonctionne bien (je l'ai testée dans un fiocher sépapré) sauf que

debug(is_string($check));

retourne false. Donc avant meme la condition.

Le deuxieme parametre de preg_match() doit être une string

Bonsoir.
Pour le premier point, c'est à dire, entre 6 et 10 caractères, tu ajoute une règle dans ton validate, qui s'appelle between

'rule' => array('between', 6, 10)

Et pour la structure tu fais une règle avec une expression régulière.
Ce n'est pas nécessaire de faire une fonction pour le validate pour ça.

De rien. :)