在 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);