NestJS 和 MySQL - 如何将默认密码插入到使用 bcrypt 哈希的用户 table 中?

NestJS and MySQL - How to insert a default password into Users table that uses bcrypt hash?

我有一个简单的 Web 应用程序,允许使用 bcrypt 存储密码来注册新用户。

我的 TypeORM 用户实体如下所示:

@Entity()
export class User extends BaseEntity {
    @PrimaryGeneratedColumn('uuid')
    id: string;

    @Column({
        type: 'nvarchar',
        length: 256,
        nullable: false,
        unique: true,
    })
    username: string;

    @Column({
        type: 'nvarchar',
        length: 256,
        nullable: false,
    })
    password: string;

    @BeforeInsert() async hashPassword() {
        this.password = await bcrypt.hash(this.password, 10); // salt rounds
    }

    async comparePasswordAsync(attempt: string): Promise<boolean> {
        return await bcrypt.compare(attempt, this.password);
    }
}

使用公开端点创建新用户工作正常。现在,假设我想在用户 table.

中使用默认管理员帐户发布产品

如何编写迁移器,以便为管理员帐户添加默认用户名和密码?

这是我的迁移器:

export class UserTable1594240665620 implements MigrationInterface {
    public async up(queryRunner: QueryRunner): Promise<void> {
        // Create the user table
        await queryRunner.query(`
            CREATE TABLE user(
                id VARCHAR(36) PRIMARY KEY NOT NULL,
                username VARCHAR(256) UNIQUE NOT NULL,
                password VARCHAR(256) NOT NULL,
            );`);

        // Add the default user
        await queryRunner.query(`INSERT INTO user(id, username, password)
             VALUES (UUID(), 'defaultAdmin', ????);
        `);
    }

    public async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`DROP TABLE user`);
    }
}

为了保存经过哈希处理的默认管理员密码,我在上面代码的 ??? 中输入了什么?

你好(我刚刚回答了你的另一个问题)。

根据 Dave S 的评论,请注意拥有默认用户的安全隐患...

作为另一个安全注释,您还应该同时使用加盐密码和散列密码,而不要单独使用散列密码。将 salt 和 hash 都保存在您的用户实体中。

一定要使用 bcryptjs 库而不是 bcrypt。它们的工作方式相同,但 bcryptjs.

不会出现部署问题
import * as bcrypt from 'bcryptjs'

// ...

const password = 'example'
const salt = await bcrypt.genSalt()
const passwordHash = await bcrypt.hash(password, salt)

至于干净地插入值,请注意您可以从 TypeORM 中的 queryRunner 中获得更多,例如:

queryRunner.manager.createQueryBuilder()

查看查询生成器的文档,但这是一个非常简单的 API,例如.insert().into(...).values({ ... }).execute().

请参阅 https://typeorm.io/#/insert-query-builder

中的文档

您可以为您的默认密码生成新的盐和哈希值,然后将这些值作为插入默认用户的一部分插入。

干杯!