如何在NestJS中使用Passport策略保护Swagger UI端点?
使用Passport策略保护NestJS的Swagger端点
完全可以用你已配置的Passport BasicStrategy来保护Swagger端点,具体步骤如下:
1. 确认Passport模块与策略已注册
确保根模块(如AppModule)中已导入PassportModule并注册你的HttpStrategy:
import { Module } from '@nestjs/common'; import { PassportModule } from '@nestjs/passport'; import { HttpStrategy } from './http.strategy'; @Module({ imports: [PassportModule], providers: [HttpStrategy], }) export class AppModule {}
2. 为Swagger路由应用Auth守卫
NestJS的SwaggerModule.setup支持通过中间件配置为Swagger的UI页面和文档接口添加守卫,直接修改main.ts的代码即可:
import { AuthGuard } from '@nestjs/passport'; import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'; // ...其他初始化代码 const config = new DocumentBuilder() .setTitle("User API") .setDescription("The User API description") .setVersion("1.0") .addTag("user") .build(); const document = SwaggerModule.createDocument(app, config); // 配置Swagger并添加守卫保护 SwaggerModule.setup('swagger', app, document, { setupMiddleware: (app) => { // *关键*:用Basic Auth守卫保护所有Swagger相关路由 app.use('/swagger*', AuthGuard('basic').canActivate); }, // 可选:让Swagger UI支持Basic Auth输入框 swaggerOptions: { authAction: { BasicAuth: { schema: { type: 'http', scheme: 'basic' }, }, }, }, });
也可以用更直接的方式在SwaggerModule.setup前单独为路由绑定守卫:
// 保护Swagger UI和文档JSON接口 app.use('/swagger', AuthGuard('basic').canActivate); app.use('/swagger-json', AuthGuard('basic').canActivate); SwaggerModule.setup('swagger', app, document);
3. 验证效果
启动应用后访问/swagger,浏览器会弹出Basic Auth登录框,只有输入正确的admin/admin凭证才能进入Swagger UI,同时/swagger-json接口也会被拦截保护。
扩展说明
如果后续要改用其他Passport策略(如JWT),只需将AuthGuard('basic')替换为对应策略名称(如AuthGuard('jwt')),同时确保对应策略已正确配置即可,无需大幅修改Swagger的保护逻辑。
内容的提问来源于stack exchange,提问作者Pollux28
相关产品推荐
相关产品推荐

