可以保护'属性并将其从select语句

时间:2017-05-01 21:23:46

标签: typeorm

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

这种方式只有在select property, property2声明中明确请求时才会显示。

4 个答案:

答案 0 :(得分:3)

TypeORM与routing-controllers相得益彰,所以您应该使用它,在幕后使用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-transformer class-validator 。您只需要在路线中手动调用验证功能,例如为了解决问题,您可以写:

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

答案 1 :(得分:2)

您可以使用删除

查找所有用户

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

答案 2 :(得分:1)

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

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

并明确选择这样的列:

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

答案 3 :(得分:0)

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