我试图在yii2高级应用中更改密码但总是失败
我有一个模型,它找到输入的密码并根据存储的密码进行检查,如果是,则返回true,但如果为false,则应该失败。
这是模型部分
这是设置用户密码的原因
public function setPassword($password)
{
$this->password = Yii::$app->security->generatePasswordHash($password);
}
这是用来比较两个密码的原因
public function findPasswords($attribute, $params){
$user = UserIdentity::find()->where([
'username'=>Yii::$app->user->identity->username
])->one();
$password = $user->password_hash; //returns current password as stored in the dbase
$hash2 = Yii::$app->security->generatePasswordHash($this->oldpass); //generates an encrypted password
if($password!= $hash2)
{
$this->addError($attribute, 'Old password is incorrect');
}
}
这始终返回旧密码不正确。 我也试过
var_dump(Yii::$app->security->generatePasswordHash(5378));
var_dump(Yii::$app->security->generatePasswordHash(5378));
上面两个返回两个不同的值为什么会这样?
可能有什么问题?
这是更新后的完整用户模型 我现在收到了获取未知属性的错误:app \ models \ UserPass :: password_hash
class UserPass extends Model{
public $oldpass;
public $newpass;
public $repeatnewpass;
public function rules(){
return [
[['oldpass','newpass','repeatnewpass'],'required'],
['oldpass','findPasswords'],
['repeatnewpass','compare','compareAttribute'=>'newpass'],
];
}
public function findPasswords($attribute, $params){
$user = UserIdentity::find()->where([
'username'=>Yii::$app->user->identity->username
])->one();
$valid = $this->validatePassword("53785378");
var_dump(validatePassword("53785378"));
die();
$password = $user->password_hash; //returns current password as stored in the dbase
$hash2 = Yii::$app->security->generatePasswordHash($this->oldpass); //generates an encrypted password
if($password!= $hash2)
{
$this->addError($attribute, 'Old password is incorrect');
}
}
public function attributeLabels(){
return [
'oldpass'=>'Old Password',
'newpass'=>'New Password',
'repeatnewpass'=>'Confirm Password',
];
}
public function validatePassword($password) {
return Yii::$app->security->validatePassword($password, $this->password_hash);
}
}
答案 0 :(得分:4)
使用validatePassword
方法而不是从输入值生成密码哈希并比较哈希值。这是一个User
模型的方法,它扩展了ActiveRecord
:
/**
* Validates password
*
* @param string $password password to validate
* @return boolean if password provided is valid for current user
*/
public function validatePassword($password) {
return Yii::$app->security->validatePassword($password, $this->password_hash);
}
答案 1 :(得分:1)
你应该使用test123.framework
而不是比较哈希,正如@simialbi所说,但要回答你的问题,为什么会返回不同的结果。
validatePassword
生成哈希的过程需要生成一个随机盐,每次都会产生不同的输出,引用documentation
答案 2 :(得分:0)
变化
$hash2 = Yii::$app->security->generatePasswordHash($this->oldpass);
if($password!= $hash2)
{
$this->addError($attribute, 'Old password is incorrect');
}
到
$validateOldPass = Yii::$app->security->validatePassword($this->oldpass,$password);
if(!$validateOldPass)
{
$this->addError($attribute, 'Old password is incorrect');
}
您需要使用validatePassword方法而不是生成新的哈希(根据@simialbi所说)。 每次生成时生成散列cahnge,从而使新的散列oldpass和散列oldpass之间的比较失败。 (按照@mhyassin所说)