Yii2 - 使用db查询进行自定义验证

时间:2016-01-26 12:05:29

标签: yii2 yii2-validation

我正在努力使这个自定义验证工作,但我现在没有得到任何东西。什么似乎是问题?

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

3 个答案:

答案 0 :(得分:3)

  • $params包含验证器参数,而非属性,
  • 您应该在查询中正确绑定参数。

e.g。 :

$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验证程序执行相同操作...

答案 1 :(得分:0)

我已检查{$ params}变量是否用于其他值。如果你想验证密码,请指定这样的值。

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

答案 2 :(得分: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'));
    }
}