Php 通过检查当前密码和输入的密码来更改yii2密码

Php 通过检查当前密码和输入的密码来更改yii2密码,php,yii2,Php,Yii2,我试图在yii2高级应用程序中更改密码,但总是失败 我有一个模型,可以找到输入的密码并对照存储的密码进行检查,如果为真,则返回真,如果为假,则应失败 这是模型零件 这就是设置用户密码的原因 public function setPassword($password) { $this->password = Yii::$app->security->generatePasswordHash($password); } 这是用来比较两个密码的 public fun

我试图在yii2高级应用程序中更改密码,但总是失败

我有一个模型,可以找到输入的密码并对照存储的密码进行检查,如果为真,则返回真,如果为假,则应失败

这是模型零件

这就是设置用户密码的原因

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\u 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);
    }


}

使用
validatePassword
方法,而不是从输入值生成密码散列并比较散列。这是一种来自
用户
模型的方法,它扩展了
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);
}

使用
validatePassword
方法,而不是从输入值生成密码散列并比较散列。这是一种来自
用户
模型的方法,它扩展了
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);
}

您应该使用
validatePassword
而不是像@similbi所说的那样比较散列,但要回答您的问题,即为什么会返回不同的结果

Yii::$app->security->generatePasswordHash(5738);

生成散列的过程需要生成一个随机salt,它每次都会产生不同的输出,

的引用您应该使用
validatePassword
而不是像@similbi所说的那样比较散列,但要回答您关于为什么会返回不同结果的问题

Yii::$app->security->generatePasswordHash(5738);
生成散列的过程需要生成一个随机的salt,它每次都会导致不同的输出,

的引用发生变化

$hash2 = Yii::$app->security->generatePasswordHash($this->oldpass);
if($password!= $hash2)
{
    $this->addError($attribute, 'Old password is incorrect');
}

您需要使用validatePassword方法,而不是生成新的哈希(如@similbi所说)。 每次生成哈希值都会导致新哈希的oldpass和哈希的oldpass之间的比较失败。(根据@mhyasin的说法)

改变

$hash2 = Yii::$app->security->generatePasswordHash($this->oldpass);
if($password!= $hash2)
{
    $this->addError($attribute, 'Old password is incorrect');
}

您需要使用validatePassword方法,而不是生成新的哈希(如@similbi所说)。
每次生成哈希值都会导致新哈希的oldpass和哈希的oldpass之间的比较失败。(根据@mhyasin所说)

我已经添加了它,但我知道hash的一个错误是无效的。该模型应该表示用户身份。按照yii2的说明来了解它到底是如何工作的我已经添加了它,但我知道得到一个错误hash是invalid模型应该代表用户身份。遵循yii2的说明,了解其具体工作原理