NestJS 排除不同用户角色字段的策略?
NestJS strategy for excluding fields for different user roles?
假设我有一个基本实体 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?
借助 class-transformer,您可以使用 groups
property 仅公开某些 groups/roles:
的属性
import {Exclude, Expose} from "class-transformer";
@Exclude()
export class User {
@Expose({ groups: ["admin"] })
secret: string;
}
关于如何使用 ClassSerializerInterceptor
组,请参阅以下内容 。
假设我有一个基本实体 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?
借助 class-transformer,您可以使用 groups
property 仅公开某些 groups/roles:
import {Exclude, Expose} from "class-transformer";
@Exclude()
export class User {
@Expose({ groups: ["admin"] })
secret: string;
}
关于如何使用 ClassSerializerInterceptor
组,请参阅以下内容