В контроллере я добавляю объект пользователя с защитой, внедряю какой-то сервис и вызываю этот сервис, чтобы получить ответ.Для краткости я удалил много кода.
@Controller()
@UseGuards(AuthGuard())
export class UserController() {
constructor(private readonly userService: UsersService) {
}
@Get(':id')
async findOne(@Param('id') id) {
return await this.userService.findOne(id);
}
}
Поскольку у меня есть AuthGuard
, теперь я знаю, что пользователь вошел в систему, прежде чем ввести :id
route.
Вservice Я бы сделал что-то вроде
@Injectable()
export class UsersService {
async findOne(id: number): Promise<User> {
return await this.usersRepository.findOne({where: {id: id}});
}
}
Но, конечно, мы хотим иметь некоторые проверки того, что вошедший в систему пользователь имеет доступ к запрашиваемому пользователю.Вопрос теперь в том, как мне получить текущего вошедшего в систему пользователя.Я могу отправить его в качестве параметра с контроллера, но так как большая часть серверной части потребует проверки безопасности текущего пользователя, я не уверен, что это хорошая идея.
@Get(':id)
async findOne(@Param('id') id, @Req() req: any) {
return await this.userService.findOne(id, req.user);
}
В идеале, которыйне работает, я мог бы получить его в UserService:
async findOne(id: number, @Req req: any): Promise<User> {
if (id === req.user.id || req.user.roles.contains('ADMIN')) {
return await this.userRepository.findOne({where: {id: id}});
}
}
Или, возможно, путем внедрения в конструкторе UserService
constructor(@Inject(REQUEST_OBJECT) private readonly req: any) {}
Итак, есть ли лучшеспособ отправить объект пользователя через бэкэнд, чем всегда отправлять объект запроса в каждом вызове функции?