2

假设我有一个基本实体 ,ShopsEntity它有一堆字段和一个秘密属性:

@ObjectType()
class ShopsEntity {

   @Field()
   name: string;

   @Field()
   rating: string;

   @Field()
   secret: string;
}

我不希望秘密属性被序列化,除非用户具有通过Nest Access Control定义的某个角色(该模块只允许将 RoleGuards 放置在解析器本身上,这意味着我需要每个角色不同的路由)。

因此,在向具有不同身份验证级别的同一端点发出请求后,管理员将获得:

{
  "name": "name",
  "rating": "rating",
  "secret": "secret"
}

一个普通的查询用户会得到:

{
  "name": "name",
  "rating": "rating"
}

是否有一种声明性方式可以在这里进行属性级安全性,或者最好的解决方案是为每个安全性级别提供单独的 DTO?

4

1 回答 1

3

使用 class-transformer,您可以使用该groups属性仅公开某些组/角色的属性:

import {Exclude, Expose} from "class-transformer";

@Exclude()
export class User {

    @Expose({ groups: ["admin"] })
    secret: string;
}

有关如何使用ClassSerializerInterceptorwith 组,请参阅以下答案

于 2019-11-12T09:09:06.843 回答