Как игнорировать некоторые маршруты из @UseGuards () в контроллере? - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть контроллер, подобный следующему:

@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'))
@ApiTags('books')
@Controller('books')
export class BooksController {

  @Post()
  async create(@Body() createBookVm: CreateBookVm) {
    //........
  }

  @Get()
  async all() {
    //........
  }
}

Когда я получаю доступ к all() маршрутизатору в вышеупомянутом контроллере без доступа, я получаю следующую ошибку:

{"statusCode":401,"error":"Unauthorized"}

Это правильно поведение, но я хочу игнорировать all() действие от общего @UseGuards контроллера. Я хочу получить доступ к нему как publi c маршрутизация без авторизации.

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Самый простой способ - сменить Страж на маршруты:

@ApiBearerAuth()
@ApiTags('books')
@Controller('books')
export class BooksController {

  @Post()
  @UseGuards(AuthGuard('jwt'))
  async create(@Body() createBookVm: CreateBookVm) {
    //........
  }

  @Get()
  async all() {
    //........
  }
}
0 голосов
/ 29 апреля 2020

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

У меня есть такой декоратор , настроенный здесь , который устанавливает метаданные, если вы хотите посмотреть, как он работает.

При таком подходе вы можете связать охрану глобально, а затем добавить декоратор @AuthSkip() (или как вы его называете) к маршрутам или классам, которые вы не хотите авторизовать.

Теперь вам нужно расширить AuthGuard('jwt') и обновить метод canActivate(), чтобы проверить эти метаданные в текущем контексте. Это означает, что вам нужно добавить Reflector в качестве зависимости к классу защиты и использовать его для получения метаданных как от класса, так и от текущего маршрута (если вы зашли так далеко, чтобы заставить его работать для игнорирования классов и не только маршруты), и если метаданные существуют, то маршрут должен был быть пропущен, верните true от охранника. Я делаю такую ​​проверку здесь , если вы хотите увидеть пример этого в действии.

...