В настоящее время я реализовал 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 и запишите его там, но для меня это не похоже на хорошее решение, поскольку я хочу разделить их.