0

我有一个这样的控制器:

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

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

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

当我all()在没有 accessToken 的情况下访问上述控制器中的 rout 时,出现以下错误:

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

这是一个正确的行为,但我想忽略控制器all()的一般行为@UseGuards。我想在未经授权的情况下将其作为公共路由访问。

4

2 回答 2

2

要提供另一个答案,尽管需要更多代码,您可以创建一个自定义装饰器,将元数据分配给类和/或类方法。理论上,此元数据将用于告诉守卫跳过对整个类或此路由的身份验证检查(取决于您如何设置元数据),然后返回true以便请求仍然可以流动。

如果你想看看它是如何工作的,我在这里设置了一个这样的装饰器来设置元数据。

使用这种方法,您可以全局绑定守卫,然后将@AuthSkip()装饰器(或任何您称之为的装饰器)添加到您不想授权的路由或类中。

现在您需要扩展AuthGuard('jwt')和更新canActivate()方法以在当前上下文中检查此元数据。这意味着您需要将Reflector作为依赖项添加到警卫类并使用它来从类和当前路由中获取元数据(如果您让它适用于忽略类而不仅仅是路由),如果元数据存在,则跳过该路线,true从警卫处返回。如果您想查看实际操作的示例,我会在此处进行此类检查。

于 2020-04-29T15:46:15.120 回答
2

最简单的方法是将Guards更改为路由:

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

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

  @Get()
  async all() {
    //........
  }
}
于 2020-04-29T13:06:23.273 回答