Пользователь отсутствует в ExecutionContext после стратегии JWT - PullRequest
0 голосов
/ 20 сентября 2019

В настоящее время я реализовал jwt guard, который работает просто отлично, используя Passport, jwt проверяет выданные токены, и я могу передать @Request, чтобы увидеть пользователя через req.user, проблема возникает после реализации аутентификации на основе ролей в качестве дополнения куже работающий охранник jwt.

Я следовал инструкциям, предоставленным на nestjs.com, однако это не помогло.https://docs.nestjs.com/guards

Базовая конфигурация ролей:

role.decorator.ts

import { SetMetadata } from '@nestjs/common';
export const Roles = (...roles: string[]) => SetMetadata('roles', roles);

role.guard.ts

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';

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

  canActivate(context: ExecutionContext): boolean {
    const roles = this.reflector.get<string[]>('roles', context.getHandler());
    if (!roles) {
      return true;
    }
    const request = context.switchToHttp().getRequest();
    const user = request.user;
    console.log(user);
    const hasRole = () => user.roles.some((role) => roles.includes(role));
    return user && user.roles && hasRole();
  }
}

RolesGuardВставлено в app.module.ts содержимое через:

providers: [{
    provide: APP_GUARD,
    useClass: RolesGuard,
  }]

Мой заголовок контроллера для проверки:

  @UseGuards(AuthGuard('jwt'))
  @Roles('admin')
  @Get('admin')
  async admin(@Request() req) {
    return this.authService.me(req.user);
  }

Должно быть проверено, предоставлен ли пользователем токен Bearer и он активен, jwt также назначит пользователяЗапросить пользователя, который я могу получить, используя @Request() req, а затем req.user, однако, когда дело доходит до @Roles('admin'), он возвращает undefined в roles.guard.ts В разделе "console.log (user)", поэтому в концепользователь не имеет права видеть данный ресурс, похоже, что RoleGuard вводится до AuthGuard('jwt'), однако запрос содержит токен Brearer, поэтому его следует преобразовать в пользователя.

Я думал изменить свойРазработайте стратегию jwt и реализуйте там интерфейс CanActivate и запишите его там, но для меня это не похоже на хорошее решение, поскольку я хочу разделить их.

1 Ответ

1 голос
/ 20 сентября 2019

Я могу подтвердить для вас, что RoleGuard вызывается до AuthGuard, так как RoleGuard глобально ограничен для приложения (где вы его определили), а AuthGuard локально ограничен дляфункция.Если вы не возражаете против того, чтобы не использовать глобальную область действия RoleGuard, а вместо этого для каждого метода, даже если для написания кода требуется больше кода, вы можете добавить его в декоратор @UseGuards.Кроме того, как вы сказали, вы можете объединить двух охранников в одного, но это может стать грязным и громоздким.

...