NestJs - Невозможно получить пользовательский контекст в RolesGuard - PullRequest
0 голосов
/ 11 июня 2018

Я использую NestJS в качестве основы для клиентского API.В рамках мы используем довольно стандартную инфраструктуру аутентификации Passport / JWT, которая работает нормально.Наш AuthGuard запускается, когда токен-носитель найден, и в защищенных конечных точках API я могу внедрить HTTP-контекст через запрос @Res () и получить доступ к свойству request.user, которое содержит полезную нагрузку моего токена Jwt..

Кроме того, мы пытаемся реализовать RolesGuard очень похоже на пример кода, представленный в документации, и на некоторые примеры проектов на GitHub (ни один из которых на самом деле не использует эту защиту, ноони включают его в качестве образца защиты).

Наша проблема в том, что наш AuthGuard запускает и проверяет токен Jwt, а затем запускает наш RolesGuard, но передаваемый объект запроса не имеет пользовательских метаданных, прикрепленных кrequest.

Код ключа в нашем RolesGuard:

    const request = context.switchToHttp().getRequest();
    const user = request.user;

    if (!user) {
        return false;
    }

В приведенном выше фрагменте пользователь всегда ложен.Кто-нибудь написал в Nest защиту на основе ролей / разрешений, которая успешно получает доступ к области действия текущего пользователя?Весь код стреляет, и все кажется зарегистрированным правильно.

-Кевин

Ответы [ 2 ]

0 голосов
/ 30 июля 2019

зарегистрируйте RoleGuard на уровне конечной точки и поместите его после AuthGuard, затем он сработает секунду, и я получаю ожидаемый пользовательский контекст внутри самого сторожа.не регистрируйте RoleGuard в модуле, потому что сначала он будет зарегистрирован и сначала запущен.

*. module.ts

imports: [],
  providers: [{provide: APP_GUARD, useClass: RolesGuard} ,],  // remove guard
  controllers: [],
  exports: [],
0 голосов
/ 11 июня 2018

В конечном счете, это похоже на проблему заказа с охраной, и не похоже, что ее можно легко решить (без рамки, позволяющей некоторый контроль над заказом).

Я надеялся зарегистрироватьRolesGuard глобально, но это приводит к тому, что он сначала регистрируется и запускается первым.

@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles('admin')

Если я зарегистрирую его на уровне конечной точки и добавлю его после AuthGuard, то он запускается вторым, и я получаю ожидаемый пользовательский контекств самой охране.Это не идеально, но это работает.

-Кевин

...