You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:32:29