是否可以 'protect' a 属性 并将其从 select 语句中排除

Is it possible to 'protect' a property and exclude it from select statements

我想在数据层级别保护某些属性。例如,我想保护我为用户存储在数据库中的密码哈希,这样它就不会出现在任意 select 语句中。

仅当在 select property, property2 语句中明确要求时才采用这种方式。

TypeORM 与 routing-controllers so you should use it, behind the scenes it uses class-transformer 一起很好地序列化和反序列化您的数据。因此,您可以使用该库中的 @Exclude 装饰器来防止某些属性被发送到客户端。

它还使用 class-validator 库在将数据指定为控制器函数中的类型时验证数据。这些是功能强大的玩具。这是一个如何利用两者的小例子:

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

如果您使用另一个服务器端库,您仍然可以利用 class-transformerclass-validator 。你只需要在你的路由中手动调用验证函数,例如对于 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();
});

这是解决方案 - https://github.com/typeorm/typeorm/issues/535 最简单的解决方案是在查询期间排除字段。

我认为更准确的答案是在列选项上设置 select: false

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

并且明确地 select 列如下:

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

您可以使用删除

示例查找所有用户

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

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

示例按 ID 查找用户

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