Yii2 - 验证密码(哈希是无效错误)

时间:2015-07-03 15:42:13

标签: yii yii2

我正在尝试验证旧用户密码,以便他能够更改密码,但此刻我收到哈希无效错误。

这是验证规则:

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

validatePassword 方法:

    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']);  

5 个答案:

答案 0 :(得分:1)

如果将$hash作为Yii::$app->getSecurity()->validatePassword传递给public function validatePassword($password){ if(is_null($this->password)) return false; return Yii::$app->getSecurity()->validatePassword($this->salt . $password, $this->password); } 方法时,会出现哈希无效错误的另一个原因。

我建议您在代码中进行这样的检查

    appBarLayout.setExpanded(false);

答案 1 :(得分:1)

我解决了这个问题,将数据库中的密码列的值从varchar(128)更改为varchar(255)并再次注册。

答案 2 :(得分:0)

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

为什么?

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

建议:

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

答案 3 :(得分:0)

我也有这个问题并且已解决

原因是我之前使用sha1算法,在将其转换为bcryptYii::$app->security->generatePasswordHash)后,我遇到了这个问题。

我以前的密码是使用sha1算法创建的,并且在数据库中。 当我将代码更改为新算法并想登录时,我错了。

如果使用新算法重置以前的密码,问题就解决了。

答案 4 :(得分:0)

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