是否可以 '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-transformer 和 class-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;
}
我想在数据层级别保护某些属性。例如,我想保护我为用户存储在数据库中的密码哈希,这样它就不会出现在任意 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-transformer 和 class-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;
}