Nest JS и MySQL - Как вставить пароль по умолчанию в таблицу Users, которая использует bcrypt ha sh? - PullRequest
0 голосов
/ 09 июля 2020

У меня есть простое веб-приложение, которое позволяет регистрировать новых пользователей, используя 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.

Как мне написать мигратор, чтобы он добавлял имя пользователя и пароль по умолчанию для учетной записи администратора?

Вот мой мигратор:

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`);
    }
}

Что мне добавить в ??? в приведенном выше коде, чтобы сохранить хешированный пароль администратора по умолчанию?

1 Ответ

1 голос
/ 09 июля 2020

И снова привет (я только что ответил на еще один ваш вопрос).

Согласно комментарию Дейва S, остерегайтесь последствий для безопасности, связанных с использованием пользователя по умолчанию ...

В качестве другой безопасности комментарий, вы также должны использовать как соль, так и хешированный пароль, а не ha sh отдельно. Сохраните и соль, и ha sh в своей пользовательской сущности.

Обязательно используйте bcryptjs библиотеку вместо bcrypt. Они работают одинаково, но у вас не будет проблем с развертыванием с bcryptjs.

import * as bcrypt from 'bcryptjs'

// ...

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

Что касается чистой вставки значений, обратите внимание, что вы можете получить гораздо больше от вашего queryRunner в TypeORM, например:

queryRunner.manager.createQueryBuilder()

Проверьте документацию по построителю запросов, но это довольно простой API, например .insert().into(...).values({ ... }).execute().

См. Документацию по адресу https://typeorm.io/# / insert-query-builder

Вы можете создать fre sh salt, а также ha sh для пароля по умолчанию, а затем вставить эти значения как часть вставки вашего пользователя по умолчанию.

Ура !

...