Yii 2-验证密码(哈希无效错误)

ecfdbz9o  于 2022-11-09  发布在  其他
关注(0)|答案(5)|浏览(218)

我正在尝试验证旧用户密码,以便他能够更改密码,但目前我收到哈希无效错误。
这是验证规则:

['password_old', function($attribute){
                if(!$this->validatePassword($this->{$attribute}))
                    $this->addError($attribute, 'Please Enter Your Old Password');
            }],

验证密码方法:

public function validatePassword($password){
            return Yii::$app->getSecurity()->validatePassword($this->salt . $password, $this->password);
        }

用于更改密码的表单:

$form = ActiveForm::begin(
            [
                'enableAjaxValidation' => true,
                'action'               => 'user/changepassword',
                'id'                   => 'changePassword'
            ]
        );

    echo $form->field($model, 'password_old')->passwordInput( ['autocomplete' => 'off'] );
    echo $form->field($model, 'password')->passwordInput(['autocomplete' => 'off'])->label('New Password');
    echo $form->field($model, 'password_confirm')->passwordInput(['autocomplete' => 'off']);
svdrlsy4

svdrlsy41#

我解决了这个问题,当把DB中密码列的值从varchar(128)改为varchar(255)并重新注册时。

cl25kdpy

cl25kdpy2#

如果将null作为$hash传递给Yii::$app->getSecurity()->validatePassword方法,则会发生Hash is invalid错误的另一个原因。
我建议您在代码中执行这样的检查

public function validatePassword($password){
        if(is_null($this->password)) 
            return false;
        return Yii::$app->getSecurity()->validatePassword($this->salt . $password, $this->password);
    }
jfgube3f

jfgube3f3#

“哈希无效错误”,因为您的密码格式不正确。

为什么?

  • 当您在验证规则中调用validatePassword时,$this->password不是存储在数据库中的密码,它是新密码-最近从您的表单中提交的。要解决问题,您可以引用yii2-basic-appyii-advanced-app中的LoginForm类。

建议:

***“Salt”**不是必需的,因为它已自动包含在函数\Yii::$app->security->generatePasswordHash中(PHP 5〉= 5.5.0 password_hash

3b6akqbq

3b6akqbq4#

我也遇到过这个问题,解决了
原因是我以前用过sha1算法,转换成bcryptYii::$app->security->generatePasswordHash)后,遇到了这个问题。
我以前的密码是用sha1算法创建的,在数据库里,当我把代码改成新的算法想登录的时候,我错了。
如果使用新算法重置以前的密码,则问题将得到解决。

zbq4xfa0

zbq4xfa05#

当数据库中比较的密码不能是哈希值时,您将得到此错误!
“$2y$13$TvlDZ5RgBL7Cr1LR9JovfOVEyMwpD6x1dy9sYlngzUIKeuEaqqiry”(第一个字符是空格)。我删除了空格字符,然后它工作了。

相关问题