我想在数据层级别保护某些属性。例如,我想保护我为用户存储在数据库中的密码哈希,这样它就不会出现在任意的select语句中。
仅当在select property, property2语句中明确请求时才采用这种方式。
我正在尝试找到一种使用 DTO(使用辉煌class-validator和class-transformer库)验证主体的好方法。它工作得非常好,即使对于嵌套结构也是如此,但在我的情况下,我希望根据某些条件拥有 body 属性。
可能有助于理解的示例:
让我们想象一下我的身体应该总是有selectedCategory。根据该字段,内容可能来自类别 1,其中包含prop1OR 来自类别 2,其中包含prop2.
我不想让他们两个都为空,我真的想要么已经prop1定义要么prop2基于selectedCategory.
我认为我可以使用管道,但是如何指定要使用的正确 DTO?
我已经构建了一个“基”类,其中包含所有公共属性和一些继承自它的其他类。
我可以根据属性手动实例化管道selectedCategory,这是理想的,但我不知道将什么作为管道的第二个参数(元数据)传递。
谢谢你的帮助。
我想序列化一个属性,其名称与实体中的名称不同。
@Entity()
export class MyEntity {
// This should be serialized with name_column in JSON
@Column()
name: string
}
Run Code Online (Sandbox Code Playgroud)
当我打电话时classToPlain,我希望将属性name序列化为name_column:
classToPlain(myEntity)
// returns: {name: 'my name'}
// should be: {name_column: 'my name'}
Run Code Online (Sandbox Code Playgroud) 编辑:
我已经看过这个问题/答案如何从控制器json中排除实体字段
但是,如下所示-这是从所有查询中排除该字段(到porint,在尝试处理用户验证时,使用在不具有ClassSerializerInterceptor的路由/控制器方法上的findOne存储库查询
我在nest.js / typeorm中有一个实体;我试图从返回的json中排除密码字段,但不从我的服务中的任何存储库查询中排除密码字段。例如:
user.entity.ts:
import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn,
UpdateDateColumn, ManyToOne } from 'typeorm';
import { Exclude } from 'class-transformer';
import { Account } from '../accounts/account.entity';
@Entity()
export class User {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column()
firstName: string;
@Column()
lastName: string;
@Column({
unique: true,
})
email: string;
@Column()
password: string;
}
Run Code Online (Sandbox Code Playgroud)
auth.controller.ts:
import { Controller, Post, Body, Request, Req, Get, UseInterceptors, ClassSerializerInterceptor, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import …Run Code Online (Sandbox Code Playgroud) 假设我有一个基本实体 ,ShopsEntity它有一堆字段和一个秘密属性:
@ObjectType()
class ShopsEntity {
@Field()
name: string;
@Field()
rating: string;
@Field()
secret: string;
}
Run Code Online (Sandbox Code Playgroud)
我不希望序列化秘密属性,除非用户具有通过Nest Access Control定义的特定角色(该模块仅允许将 RoleGuard 放置在解析器本身上,这意味着每个角色需要不同的路由)。
因此,在向具有不同身份验证级别的同一端点发出请求后,管理员将得到:
{
"name": "name",
"rating": "rating",
"secret": "secret"
}
Run Code Online (Sandbox Code Playgroud)
常规查询用户将得到:
{
"name": "name",
"rating": "rating"
}
Run Code Online (Sandbox Code Playgroud)
是否有一种声明性的方式可以在这里实现属性级安全性,或者最好的解决方案是为每个安全级别提供单独的 DTO?