1

このカスタム検証を機能させようとしていますが、現時点では何も得られません。問題に見えるのは?

['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.');
            }],
4

3 に答える 3

3
  • $params属性ではなくバリデータパラメータを含み、
  • クエリでパラメーターを正しくバインドする必要があります。

例:

$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.');

または、ActiveRecordモデルを作成し、バリデーターをforbiddenPasswords使用uniqueして同じことを行うこともできます...

于 2016-01-26T13:23:24.577 に答える
0

オープンパスワードバリデーターを書かないでください。安全ではありません。

Yii2 では、 SecurityコンポーネントvalidatePasswordのメソッドを使用できます。

メソッドによるパスワードのデータベース ハッシュへの最初の格納setPassword:

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

モデルにはメソッドが必要ですvalidatePassword

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

または、Userモデルをフォームとして使用する場合は、次のように記述できます。

/**
 * @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'));
    }
}
于 2016-01-26T13:23:31.707 に答える