Swagger聚合:为所有接口添加授权请求头
嘿,我来帮你搞定给聚合的Swagger接口统一添加授权请求头的问题~根据不同的场景,这里有几种实用的方案:
场景1:让Swagger UI测试接口时自动带上授权头
这应该是你最常用的需求——用户在Swagger UI里调试接口时,所有请求自动携带授权头。
方案1:配置Swagger全局请求参数(Springfox)
如果你的项目用的是Springfox Swagger,只需要创建一个配置类,添加全局请求参数就行。这样Swagger UI顶部会出现一个输入框,用户输入授权值后,所有测试请求都会自动带上这个头:
@Configuration @EnableSwagger2 public class SwaggerGlobalHeaderConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() // 聚合器本身可能没有业务接口,随便填个自己的包路径就行 .apis(RequestHandlerSelectors.basePackage("com.your.aggregator.package")) .paths(PathSelectors.any()) .build() .globalRequestParameters( List.of( new RequestParameterBuilder() .name("Authorization") .description("授权格式:Bearer {你的Token}") .in(ParameterType.HEADER) .required(false) // 根据业务需求设置是否必填 .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING))) .build() ) ); } }
方案2:自定义Swagger UI请求拦截器(自动带Token)
如果你的前端已经把Token存在localStorage里,想让Swagger UI自动读取并添加到请求头,可以自定义Swagger UI的配置,添加一个请求拦截脚本:
@Configuration public class SwaggerUiCustomConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/swagger-ui/**") .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); } @Bean public SwaggerUiConfigParameters swaggerUiConfigParameters() { SwaggerUiConfigParameters config = new SwaggerUiConfigParameters(); // 这里的脚本会在请求发起前自动从localStorage取token并添加到请求头 config.setRequestInterceptor("(request) => { const token = localStorage.getItem('authToken'); if (token) { request.headers['Authorization'] = 'Bearer ' + token; } return request; }"); return config; } }
场景2:聚合器获取各服务的api-docs时需要授权
如果你的各个微服务的v2/api-docs接口本身需要授权才能访问,那就要让聚合器在请求这些接口时带上授权头。可以通过给RestTemplate添加拦截器来统一处理:
@Component @Primary @EnableAutoConfiguration public class SwaggerAggregatorController implements SwaggerResourcesProvider { private final RestTemplate restTemplate; public SwaggerAggregatorController(RestTemplate restTemplate) { this.restTemplate = restTemplate; } @Override public List<SwaggerResource> get() { List<SwaggerResource> resources = new ArrayList<>(); SwaggerResource custSwagger = new SwaggerResource(); custSwagger.setName("cust-service"); custSwagger.setLocation("/cust/cust-service/v2/api-docs"); custSwagger.setSwaggerVersion("2.0"); resources.add(custSwagger); // 可以继续添加其他服务的Swagger资源 return resources; } // 配置RestTemplate的拦截器,统一给所有请求添加授权头 @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); restTemplate.getInterceptors().add((request, body, execution) -> { // 这里可以根据实际情况动态获取Token,比如从配置中心或当前上下文 request.getHeaders().add("Authorization", "Bearer your-dynamic-token"); return execution.execute(request, body); }); return restTemplate; } }
根据你的实际需求选对应的方案就好啦~
内容的提问来源于stack exchange,提问作者Ganesh Satpute
相关产品推荐
相关产品推荐

