Можно ли "защитить" свойство и исключить его из операторов выбора

Я хотел бы защитить определенные свойства на уровне уровня данных. Например, я хотел бы защитить хеш пароля, который я храню в базе данных для пользователя, чтобы он не отображался произвольно select-заявления.

Таким образом, только когда это явно запрашивается в select property, property2 заявление.

5 ответов

Я думаю, что более точным ответом было бы установить select: false по опциям столбца:

@Column({ select: false })
password: string;

И явно выберите столбец так:

const user = await getRepository(User)
    .createQueryBuilder()
    .addSelect('password')
    .getOne()

TypeORM хорошо сочетается с контроллерами маршрутизации, поэтому вы должны использовать его, за кулисами он использует преобразователь классов для сериализации и десериализации ваших данных. Таким образом, вы можете использовать @Exclude декоратор из этой библиотеки для предотвращения отправки определенных свойств клиентам.

Он также использует библиотеку валидатора класса для проверки данных при указании их в качестве типа в функциях контроллера. Это мощные игрушки. Вот небольшой пример того, как вы можете использовать оба:

import { Entity, Column, PrimaryGeneratedColumn, Index, OneToMany } from "typeorm";
import { Exclude, Expose } from "class-transformer";
import { IsNotEmpty, IsEmail, MinLength, MaxLength, Min, Max, IsNumber, IsString } from "class-validator";

@Entity()
export class User extends BaseEntity {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  @IsNotEmpty()
  @IsEmail()
  @Index({ unique: true })
  email: string;

  @Exclude()
  @Column()
  passwordHash: string;

  @Column()
  @IsNotEmpty()
  @IsString()
  firstName: string;

  @Column()
  @IsNotEmpty()
  @IsString()
  lastName: string;

  @Column({ type: 'integer', default: Gender.NotSpecified })
  @IsNumber()
  @Min(1)
  @Max(3)
  gender: Gender;


  @Expose()
  get admin() {
    return this.role == Role.Admin;
  }

  @Expose()
  get stylist() {
    return this.role == Role.Stylist;
  }
}

Если вы используете другую библиотеку на стороне сервера, вы все равно можете воспользоваться преобразователем классов и валидатором классов. Вам просто нужно вызвать функцию validate вручную в ваших маршрутах, например, для restify вы можете написать:

import {validate } from "class-validator";
import {plainToClass} from "class-transformer";
// ... more code

server.post('/hello', function create(req, res, next) {
   let bodyJSON = parseBodyTheWayYouWant(req.body);
   let post = plainToClass(bodyJSON);
   validate(post)
   return next();
});

Вы можете использовать удаление

Пример Найти всех пользователей

async findUsers(){
   const users:User[] = await userRepository.find();

    return users.map(user => { 
        delete user.password;
        delete user.salt;
        return user;
    }) ;
}

Пример поиска пользователя по идентификатору

async findUserById(id){
   const user:User = await userRepository.findOne(id);
   delete user.password;
   return user;
}

Вот решение - https://github.com/typeorm/typeorm/issues/535 Самое простое решение - исключить поля во время запроса.

х.service.ts:

      const data = await this.a.create(A);
await this.a.save(data);
return await this.a.findOneBy({ xx });

x.entity.ts

      @Column({select:false}) // Key points for database queries [await this.a.findOneBy({ xx })]
xxx: string
Другие вопросы по тегам