首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NestJS和MySQL -如何将默认密码插入到使用bcrypt hash的用户表中?

NestJS和MySQL -如何将默认密码插入到使用bcrypt hash的用户表中?
EN

Stack Overflow用户
提问于 2020-07-09 06:23:28
回答 1查看 539关注 0票数 0

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

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

代码语言:javascript
运行
复制
@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);
    }
}

使用公开的终结点创建新用户工作得很好。现在,假设我想在User表中使用默认的管理员帐户发布产品。

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

下面是我的migrator:

代码语言:javascript
运行
复制
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`);
    }
}

为了保存散列的默认管理员密码,我应该在上面代码中的???中输入什么?

EN

Stack Overflow用户

回答已采纳

发布于 2020-07-09 08:10:45

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

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

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

一定要在bcrypt上使用bcryptjs库。它们的工作原理是一样的,但是使用bcryptjs不会有部署问题。

代码语言:javascript
运行
复制
import * as bcrypt from 'bcryptjs'

// ...

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

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

代码语言:javascript
运行
复制
queryRunner.manager.createQueryBuilder()

查看文档中的查询构建器,但这是一个非常简单的应用程序接口,例如.insert().into(...).values({ ... }).execute()

请参阅https://typeorm.io/#/insert-query-builder上的文档

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

干杯!

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62804559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档