在 Yii2 迁移期间如何加密密码?
How can I bcrypt a password during Yii2 Migrations?
我有一个问题。我有一个迁移文件,该文件将一个管理员用户和一个普通用户批量插入到数据库中。现在我准备好了文件,它们工作正常。但是,在 Yii1.1 中插入时,密码曾经有一个 md5 散列,如下所示:
'password'=>md5('admin')
我的问题是,我可以在 Yii2 中用 bcrypt 做类似的事情吗?我在创建过程中在哪里加密密码?我用 batchInsert('users', ['column1', 'column2' ...], ['Jon', 'Doe' ...], ['Jane', 'Doe'...])
非常感谢任何帮助!
在 Yii2 中散列密码的正确方法是使用 yii\base\Security::generatePasswordHash()
。
此方法使用 password_hash()
函数和 PASSWORD_DEFAULT
常量作为算法。我认为目前该常量仍然指的是 bcrypt 算法。但它应该是 future-proof。当 PHP 转向另一种算法时,您无需更改代码。如果 password_hash()
函数不可用,generatePasswordHash()
方法回退到 crypt()
函数。
在迁移中,您可以像在其他任何地方使用它们一样使用应用程序组件。例如:
$this->batchInsert(
'users',
['first_name', 'last_name', 'password', ...],
[
['John', 'Doe', Yii::$app->security->generatePasswordHash('mySecretPassword'), ...],
['Jane', 'Doe', Yii::$app->security->generatePasswordHash('anotherPassword'), ...],
]
);
或者如果您更喜欢依赖注入方法:
use yii\base\Security;
use yii\db\Migration;
class WhateverMigrationName extends Migration
{
private Security $security;
public function __construct(Security $security, $config = [])
{
parent::__construct($config);
$this->security = $security;
}
public function safeUp()
{
// ...
$this->batchInsert(
'users',
['first_name', 'last_name', 'password', ...],
[
['John', 'Doe', $this->security->generatePasswordHash('mySecretPassword'), ...],
['Jane', 'Doe', $this->security->generatePasswordHash('anotherPassword'), ...],
]
);
// ...
}
// ...
}
要根据 generatePasswordHash()
创建的哈希验证密码,您可以用相同的方式调用 yii\base\Security::validatePassword()
方法。例如:
Yii::$app->security->validatePassword($password, $storedHash);
我有一个问题。我有一个迁移文件,该文件将一个管理员用户和一个普通用户批量插入到数据库中。现在我准备好了文件,它们工作正常。但是,在 Yii1.1 中插入时,密码曾经有一个 md5 散列,如下所示:
'password'=>md5('admin')
我的问题是,我可以在 Yii2 中用 bcrypt 做类似的事情吗?我在创建过程中在哪里加密密码?我用 batchInsert('users', ['column1', 'column2' ...], ['Jon', 'Doe' ...], ['Jane', 'Doe'...])
非常感谢任何帮助!
在 Yii2 中散列密码的正确方法是使用 yii\base\Security::generatePasswordHash()
。
此方法使用 password_hash()
函数和 PASSWORD_DEFAULT
常量作为算法。我认为目前该常量仍然指的是 bcrypt 算法。但它应该是 future-proof。当 PHP 转向另一种算法时,您无需更改代码。如果 password_hash()
函数不可用,generatePasswordHash()
方法回退到 crypt()
函数。
在迁移中,您可以像在其他任何地方使用它们一样使用应用程序组件。例如:
$this->batchInsert(
'users',
['first_name', 'last_name', 'password', ...],
[
['John', 'Doe', Yii::$app->security->generatePasswordHash('mySecretPassword'), ...],
['Jane', 'Doe', Yii::$app->security->generatePasswordHash('anotherPassword'), ...],
]
);
或者如果您更喜欢依赖注入方法:
use yii\base\Security;
use yii\db\Migration;
class WhateverMigrationName extends Migration
{
private Security $security;
public function __construct(Security $security, $config = [])
{
parent::__construct($config);
$this->security = $security;
}
public function safeUp()
{
// ...
$this->batchInsert(
'users',
['first_name', 'last_name', 'password', ...],
[
['John', 'Doe', $this->security->generatePasswordHash('mySecretPassword'), ...],
['Jane', 'Doe', $this->security->generatePasswordHash('anotherPassword'), ...],
]
);
// ...
}
// ...
}
要根据 generatePasswordHash()
创建的哈希验证密码,您可以用相同的方式调用 yii\base\Security::validatePassword()
方法。例如:
Yii::$app->security->validatePassword($password, $storedHash);