如何在 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 ...
}
我目前正在试验 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 ...
}