NestJS - Доступ к пользователю из Guard

avatar
Toby Boulton
9 августа 2021 в 05:30
691
2
2

Я следил за официальной документацией NestJS. Я успешно настроил аутентификацию по паспорту JWT. Я могу получить доступ к сведениям о пользователе из @Req в контроллерах, но у меня возникают проблемы с доступом к сведениям о пользователе из пользовательской защиты.

Все отлично работает

@UseGuards(RolesGuard)
@Get('me')
  getProfile(@Request() req) {
    return req.user;
  }

Это не так (в настоящее время ведется журнал для отладки)

@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private reflector: Reflector) {}

  canActivate(context: ExecutionContext): boolean {
    const roles = this.reflector.get<string[]>('roles', context.getHandler());
    if (!roles) {
      console.log('No Roles');
      return true;
    }
    const request = context.switchToHttp().getRequest();
    
    // Returns Undefined 
    console.log(request.user);
    return true;
  }
}

Вот как я объявляю каждую запись в контроллере

  @Get()
  @UseGuards(RolesGuard)
  @Roles('admin')
  findAll() {
    return this.usersService.findAll();
  }

Передача метаданных ролей работает нормально, просто похоже, что пользователь не добавляется в контекст на правильном этапе.

Любая помощь будет здоровой, спасибо!

EDIT: обновлен @UseGuards(RolesGuard), скопирован и вставлен неверный вариант

Источник

Ответы (2)

avatar
Toby Boulton
9 августа 2021 в 22:46
1

Похоже, я починил, нужно связать их в цепочку

@Get()
  @Roles('admin')
  @UseGuards(JwtAuthGuard, RolesGuard)
  findAll() {
    return this.usersService.findAll();
  }
avatar
Youba
9 августа 2021 в 08:22
1

Проблема в том, что вы не используете rolesGuard :

@UseGuards(JwtAuthGuard) // <= replace JwtAuthGuard with your guard: RolesGuard 
@Get('me')
getProfile(@Request() req) {
return req.user;
 }

то же для второго метода.

Toby Boulton
9 августа 2021 в 22:38
0

Эй, получаю то же самое, undefined. Раньше я пытался использовать охрану ролей, но скопировал и вставил сюда неправильную версию, устраняя неполадки с туннельным зрением.

Toby Boulton
9 августа 2021 в 22:47
0

Похоже, я это исправил, нужно приковать охранников в соответствии с моим собственным ответом :)