如何使用事件订阅者类型来散列密码

How to Hash a Password with the Event Subscriber Typeorm

快速提问:

我在 Whosebug 上搜索过,没有看到像这样直接的问题,而且 google 似乎没有给出很好的答案。

我正在使用 Nestjs 和 Typeorm,并且正在尝试使用 EventSubscriber() 对密码进行哈希处理。

代码如下: user.subscriber.ts

@EventSubscriber()
export class UserSubscriber implements EntitySubscriberInterface<User> {
    private iterations = Number(process.env.PASSWORD_ITERATIONS);
    // eslint-disable-next-line @typescript-eslint/ban-types
    public listenTo(): Function | string {
        return User;
    }

    public afterLoad(
        entity: User,
        event?: LoadEvent<User>,
    ): Promise<any> | void {}

    public beforeInsert(event: InsertEvent<User>): Promise<any> | void {
        const { password } = event.entity;
        const salt = crypto.randomBytes(20).toString('hex');
        const hash = crypto
            .pbkdf2Sync(password, salt, this.iterations, 32, 'sha512')
            .toString('hex');
        event.entity.password = [salt, hash].join('$');
    }
}

我试图在插入之前对密码进行哈希处理,然后将其设置为用户密码。很简单的东西。我只是想确保我在这里做的方式是最好的方式。它有效,但我担心像我现在这样重置 event.entity.password

任何反馈将不胜感激,如果这不是这个问题的地方,请告诉我,我会移动它。 :) 谢谢!

您可以通过使用 @BeforeInsert() 挂钩在您的实体定义中执行此操作 喜欢:

@Entity()
export class JohnEntity {

    @BeforeInsert()
    hashPassword() {
        const hashedPassword = hashMyPass(this.password);
        this.password = hashedPassword;
    } 

    @Column('text') password: string;
}

我写在这里,可能有错误。尝试自己写。 它可以很好地用于散列密码或任何东西。