Yii2 - 使用数据库查询进行自定义验证
Yii2 - custom validation with db query
我正在尝试使此自定义验证有效,但目前我什么也没得到。好像是什么问题?
['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.');
}],
我已经检查过 {$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.');
}],
$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.');
或者您可以为 forbiddenPasswords
创建一个 ActiveRecord
模型并使用 unique
验证器来做同样的事情...
不要编写开放式密码验证程序。这是不安全的!
在 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'));
}
}
我正在尝试使此自定义验证有效,但目前我什么也没得到。好像是什么问题?
['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.');
}],
我已经检查过 {$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.');
}],
$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.');
或者您可以为 forbiddenPasswords
创建一个 ActiveRecord
模型并使用 unique
验证器来做同样的事情...
不要编写开放式密码验证程序。这是不安全的!
在 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'));
}
}