Estoy tratando de hacer que esta validación personalizada funcione, pero no obtengo nada en este momento. ¿Cuál parece ser el problema?

['password', function($attribute, $params){

                $password = \Yii::$app->db
                    ->createCommand("SELECT * FROM forbiddenPasswords WHERE password = '{$params}'")
                    ->queryOne();

                if($password)
                    $this->addError($attribute, 'This password is forbidden. Please try another.');
            }],
1
Sasha 26 ene. 2016 a las 15:05

3 respuestas

La mejor respuesta
  • $params contiene parámetros de validación, no atributos,
  • debe vincular correctamente el parámetro en su consulta.

P.ej. :

$count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM forbiddenPasswords WHERE password = :password')
    ->bindValue(':password', $this->password)
    ->queryScalar();

if($count)
    $this->addError($attribute, 'This password is forbidden. Please try another.');

O puede crear un modelo ActiveRecord para forbiddenPasswords y usar unique validador para hacer lo mismo ...

3
soju 26 ene. 2016 a las 13:23

No escriba un validador de contraseña abierto. ¡No es seguro!

En Yii2 puedes usar el método validatePassword de Componente de seguridad.

Primer almacenamiento en la base de datos hash de contraseña mediante el método setPassword:

/**
 *
 * @param string $password WARNING! OPEN PASSWORD!
 */
public function setPassword($password)
{
    $this->password_hash = Yii::$app->security->generatePasswordHash($password);
}

En el modelo debería tener el método validatePassword:

/**
 * @param string $password WARNING! OPEN PASSWORD!
 *
 * @return boolean
 */
public function validatePassword($password)
{
    return Yii::$app->security->validatePassword($password, $this->password_hash);
}

O, si desea utilizar el modelo User como formulario, puede escribir esto:

/**
 * @inheritdoc
 */
public function rules()
{
    return [
        ...
        ['password', 'validatePassword']
    ];
}

/**
 * @param string $attribute attribute name
 * @param array $params Additional params
 */
public function validatePassword($attribute, $params)
{
    if (Yii::$app->security->validatePassword($this->$attribute, $this->password_hash) == false) {
        $this->addError($attribute, Yii::t('frontend', 'Incorrect password'));
    }
}
0
Community 20 jun. 2020 a las 09:12

He comprobado que la variable {$ params} es para valores adicionales. Y si desea validar la contraseña asigne el valor así.

 ['password', function($attribute, $params){

           $pass=$this->password;
            $password = \Yii::$app->db
                ->createCommand("SELECT * FROM forbiddenPasswords WHERE password = '{$pass}'")
                ->queryOne();

            if($password)
                $this->addError($attribute, 'This password is forbidden. Please try another.');
        }],
0
Anamika Shrivastava 26 ene. 2016 a las 13:18