如何全局应用 Swagger UI 的 @ApiBearerAuth() 而不是申请每个控制器

Posted

技术标签:

【中文标题】如何全局应用 Swagger UI 的 @ApiBearerAuth() 而不是申请每个控制器【英文标题】:How to globally apply Swagger UI's @ApiBearerAuth() instead of applying for each controller 【发布时间】:2021-01-23 22:20:08 【问题描述】:

我正在开发基于 nestJS 的 api,并且我正在使用 Swagger UI 文档。我想为我的所有控制器保留 @ApiBearerAuth() 的功能,但是我希望将其作为全局功能。这样每次我创建新的路由或端点时,它都会被覆盖。

来自https://docs.nestjs.com/openapi/security 文档:

@ApiBearerAuth()
@Controller('cats')
export class CatsController 

这是我现在正在关注的,但是有没有办法全局设置它?

【问题讨论】:

我认为默认情况下这是不可能的,但是有一个很棒的库可以帮助你实现它,它的名字是:npmjs.com/package/@golevelup/nestjs-discovery 使用它你应该能够构建自己的模块来制作它没有任何其他问题。 阅读这个包,似乎这可以让我找到使用特定装饰器的所有方法。但是,我似乎无法使用它来查找所有@Controllers,而且看起来也没有一种方法可以添加您想要的装饰器。是否有任何示例/教程。 【参考方案1】:

这是一个小技巧,因为我在每个控制器中都使用了 ApiTags,所以我创建了一个新的装饰器

import  applyDecorators  from '@nestjs/common';

export function ApiTagsAndBearer(...tags: string[]) 
  return applyDecorators(
    ApiBearerAuth(), //
    ApiTags(...tags),
  );

【讨论】:

【参考方案2】:

是的,您可以在 DocumentBuilder 中添加:

.addSecurity('ApiKeyAuth', 
    type: 'apiKey',
    in: 'header',
    name: 'Authorization',
)
.addSecurityRequirements('ApiKeyAuth')

【讨论】:

以上是关于如何全局应用 Swagger UI 的 @ApiBearerAuth() 而不是申请每个控制器的主要内容,如果未能解决你的问题,请参考以下文章

在 Swagger UI 中,如何自定义 body 输入 ui(模型架构 UI)

如何使用 springfox 在 Swagger UI 中绕过授权

thinkphp 集成swagger-ui

Swagger-UI 和 Ktor 如何导入 swagger.json 或 .yaml 文件并启动 Swagger-UI?

如何复写 springfox swagger2controller

[第二篇]如何在ASP.Net Core的生产环境中使用OAuth保护swagger ui