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

时间:2016-08-09 14:23:30

标签: php yii2

我试图在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);
    }


}

3 个答案:

答案 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所说)