如何在 Yii2 中正确散列密码(出现 "Hash is invalid" 错误)

How to hash a password correctly in Yii2 (Getting "Hash is invalid" error)

我目前正在试验 Yii2,我正在尝试散列新创建用户的密码。我认为散列处理得很好,但是当我尝试使用用户和他的新散列密码登录时,出于某种原因我收到 Hash is invalid 错误。

我已经检查过 ,但找不到适合我的解决方案。

在我的 UserController.php 我有以下操作:

public function actionCreate()
    {
        $model = new User();

        if ($this->request->isPost) {
            if ($model->load($this->request->post()) && $model->save()) {
                \Yii::$app->security->generatePasswordHash($model->password);
                return $this->redirect(['view', 'id' => $model->iduser]);
            }
        } else {
            $model->loadDefaultValues();
        }

        return $this->render('create', [
            'model' => $model,
        ]);
    } 

在我的 User.php 模型中,我使用以下函数来验证密码:

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

谁能告诉我我做错了什么?因为我看不到我在这里错过了什么。

您正在使用 $model->save() 保存未经哈希处理的密码。 \Yii::$app->security->generatePasswordHash($model->password) 创建密码哈希并 returns 它。但是您没有以任何方式使用返回的哈希值。

您需要将数据加载到模型中,在模型的 password 属性中设置散列密码,然后保存模型:

if ($this->request->isPost) {
    if ($model->load($this->request->post())) {
        $model->password = \Yii::$app->security->generatePasswordHash($model->password);
        if ($model->save()) {
            return $this->redirect(['view', 'id' => $model->iduser]);
        }
    }
}

您还可以覆盖 load() 方法以在数据加载后立即对密码进行哈希处理。

class User extends ActiveRecord implements IdentityInterface
{
    public function load($data, $formName = null)
    {
        $result = parent::load($data, $formName);

        //only hash password if it was changed
        if ($result && $this->isAttributeChanged('password')) {
            $this->password = Yii::$app->security->generatePasswordHash($this->password);
        }

        return $result;
    }

    // ... other definitions ...
}