Как работает RoleGuard в Nest JS? с JWT - PullRequest
1 голос
/ 18 марта 2020

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

Но я не могу понять, как на самом деле работает этот RoleGuard. И я не могу заставить его работать.

Я хотел, чтобы пользователь с указанными c правилами имел доступ к некоторым конечным точкам, как только пользователь с правами администратора разрешено получать весь список пользователей.

В чем, похоже, проблема? У кого-нибудь есть идея? Я предоставил фрагменты ниже. И после запроса я должен просто добавить роль в теле запроса? или было бы хорошо, если бы я получил текущего зарегистрированного пользователя и определил роль? Спасибо.

Вот мои пользовательские данные, которые играют роль:

"id": 11, {
    "role": "admin",
    "username": "myadmin@test.com",
    "created": "2020-03-18T02:30:04.000Z",
    "updated": "2020-03-18T03:02:12.000Z"
}

SampleCode

 import { JwtAuthGuard } from '../../auth/jwt-auth.guard';
    import { RolesGuard } from '../../common/guards/roles.guard';
    import { Roles } from '../common/decorators/roles.decorator';

    @Controller('user')
    @UseGuards(JwtAuthGuard, RolesGuard)
    export class UserController {
      constructor(private readonly usersService: UsersService) {}

      @Get()
      @Roles('admin')
      findAll(): Promise<UserEntity[]> {
        return this.usersService.findAll();
      }

RoleGuard

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

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

        return user && user.roles && hasRole();
      }
    }
...