如何在Yii2迁移期间加密密码?

irlmq6kh  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(152)

我有一个问题。我有一个迁移文件,那批插入一个管理员用户和一个普通用户到一个数据库。现在我已经准备好了文件,他们的工作很好。但是,在插入Yii1.1的时候,密码有一个md5哈希,类似于:'password'=>md5('admin')
我的问题是,我能在Yii 2中用bcrypt做一些类似的事情吗?在创建过程中我对密码进行加密?我使用batchInsert('users', ['column1', 'column2' ...], ['Jon', 'Doe' ...], ['Jane', 'Doe'...])
任何帮助都将不胜感激!

uelo1irk

uelo1irk1#

在Yii2中正确的散列密码方法是使用yii\base\Security::generatePasswordHash()。这个方法使用password_hash()函数和PASSWORD_DEFAULT常量作为算法。我认为目前这个常量仍然指的是bcrypt算法。但它是为了适应未来的需要。当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);

相关问题