我有一个简单的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);
}
}
使用公开的终结点创建新用户工作得很好。现在,假设我想在User表中使用默认的管理员帐户发布产品。
如何编写migrator,以便为管理员帐户添加默认用户名和密码?
下面是我的migrator:
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`);
}
}
为了保存散列的默认管理员密码,我应该在上面代码中的???
中输入什么?
发布于 2020-07-09 08:10:45
再次问好(我刚刚回答了你的另一个问题)。
根据Dave S的评论,请注意拥有默认用户的安全含义...
作为另一个安全注释,您还应该同时使用盐密码和散列密码,而不是单独使用散列密码。在用户实体中保存salt和hash。
一定要在bcrypt
上使用bcryptjs
库。它们的工作原理是一样的,但是使用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()
查看文档中的查询构建器,但这是一个非常简单的应用程序接口,例如.insert().into(...).values({ ... }).execute()
。
请参阅https://typeorm.io/#/insert-query-builder上的文档
您可以为默认密码生成新的盐和散列,然后将这些值作为插入默认用户的一部分进行插入。
干杯!
https://stackoverflow.com/questions/62804559
复制相似问题