Можно ли "защитить" свойство и исключить его из операторов выбора
Я хотел бы защитить определенные свойства на уровне уровня данных. Например, я хотел бы защитить хеш пароля, который я храню в базе данных для пользователя, чтобы он не отображался произвольно select
-заявления.
Таким образом, только когда это явно запрашивается в select property, property2
заявление.
5 ответов
Я думаю, что более точным ответом было бы установить select: false
по опциям столбца:
@Column({ select: false })
password: string;
И явно выберите столбец так:
const user = await getRepository(User)
.createQueryBuilder()
.addSelect('password')
.getOne()
TypeORM хорошо сочетается с контроллерами маршрутизации, поэтому вы должны использовать его, за кулисами он использует преобразователь классов для сериализации и десериализации ваших данных. Таким образом, вы можете использовать @Exclude
декоратор из этой библиотеки для предотвращения отправки определенных свойств клиентам.
Он также использует библиотеку валидатора класса для проверки данных при указании их в качестве типа в функциях контроллера. Это мощные игрушки. Вот небольшой пример того, как вы можете использовать оба:
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;
}
}
Если вы используете другую библиотеку на стороне сервера, вы все равно можете воспользоваться преобразователем классов и валидатором классов. Вам просто нужно вызвать функцию validate вручную в ваших маршрутах, например, для 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();
});
Вы можете использовать удаление
Пример Найти всех пользователей
async findUsers(){
const users:User[] = await userRepository.find();
return users.map(user => {
delete user.password;
delete user.salt;
return user;
}) ;
}
Пример поиска пользователя по идентификатору
async findUserById(id){
const user:User = await userRepository.findOne(id);
delete user.password;
return user;
}
Вот решение - https://github.com/typeorm/typeorm/issues/535 Самое простое решение - исключить поля во время запроса.
х.service.ts:
const data = await this.a.create(A);
await this.a.save(data);
return await this.a.findOneBy({ xx });
x.entity.ts
@Column({select:false}) // Key points for database queries [await this.a.findOneBy({ xx })]
xxx: string