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
中的文档
您可以为您的默认密码生成新的盐和哈希值,然后将这些值作为插入默认用户的一部分插入。
干杯!
我有一个简单的 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
中的文档您可以为您的默认密码生成新的盐和哈希值,然后将这些值作为插入默认用户的一部分插入。
干杯!