Springboot、CXF 3.2.7、Swagger2Feature:授权header没有出现在请求headers中

Springboot, CXF 3.2.7, Swagger2Feature: Authorization header does not appear in the request headers

我正在尝试将 Swagger 2 集成到我的 API 中,它是使用 CXF 最新版本实现的:3.2.7.

我尝试了很多教程,CXF official documentation, others too (e.g. Spring Boot, Apache CXF, Swagger under JAX-RS)。 招摇的官方网站对我没有帮助。 The swagger OpenAPI 2.0 authentication doc is not working, neighter the OpenAPI 3.0.

它不适用于 Open API 3.0.0 的组件方案,所以我继续使用 apiKeyDefinition。

可以在@Naoj 的回答中的这个线程中找到现在可用的那个: CXF Swagger2Feature adding securityDefinitions

使用此解决方案,出现了 swagger ui 并且显示了 Autorize 按钮。

我填写了身份验证表,然后尝试使用 swagger-ui 发送请求。问题是授权 header 没有出现在请求中,所以我得到了 401 响应。


在 pom 中:

<dependency>    
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-rs-service-description-swagger</artifactId>
    <version>3.2.7</version>
</dependency>
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>swagger-ui</artifactId>
    <version>3.20.1</version>
</dependency>

我的 swagger 配置如下所示:

@Configuration
public class SwaggerConfig {

    @Bean
    @ConfigurationProperties("swagger")
    public Swagger2Feature swagger() {
        return new ExtendedSwagger2Feature();
    }

    @Bean
    @DependsOn("jaxRsServer")
    public ServletContextInitializer initializer() {
        return servletContext -> {
            BeanConfig scanner = (BeanConfig) ScannerFactory.getScanner();
            Swagger swagger = scanner.getSwagger();
            servletContext.setAttribute("swagger", swagger);
        };
    }
}

扩展的 swagger 功能如下:

@Provider(value = Provider.Type.Feature, scope = Provider.Scope.Server)
public class ExtendedSwagger2Feature extends Swagger2Feature {

    @Override
    protected void addSwaggerResource(Server server, Bus bus) {
        super.addSwaggerResource(server, bus);

        BeanConfig config = (BeanConfig) ScannerFactory.getScanner();
        Swagger swagger = config.getSwagger();
        swagger.securityDefinition("Bearer", new ApiKeyAuthDefinition("authorization", In.HEADER));
    }
}

我尝试配置基于 Bearer JWT 令牌的身份验证。我的 application.yml 包含以下内容:

swagger:
   basePath: /rest
   title: Backend Application
   description: Swagger documentation of Backend Application REST services
   license:
   licenceUrl:
   contact:
   resourcePackage: my.resource.package
   scan: true
   apiKeyAuthDefinition:
     name: Authorization
     in: header
     type: http

我将 SwaggerConfig 导入到我的@SpringBootApplication class 中,如下所示:

@Import(SwaggerConfig.class)

它正在工作,如我所见,swagger 出现了,标题和描述字段填充了我的 yml 的属性。

我错过了什么?任何建议将不胜感激。 提前致谢。

您可以简化代码并删除 ExtendedSwagger2Featureinitializer()。如下修改您的 swagger() 方法,输出将相同:

@Bean
@ConfigurationProperties("swagger")
public Swagger2Feature swagger() {
    Swagger2Feature swagger2Feature = new Swagger2Feature();
    swagger2Feature.setSecurityDefinitions(Collections.singletonMap("bearerAuth",
            new ApiKeyAuthDefinition("Authorization", In.HEADER)));
    return swagger2Feature;
}

令牌未添加到您的请求中的原因是 securityDefinitions 只是可用方案的声明。您需要通过添加(到您的 TestResource 接口)将其应用于操作:

@Api( authorizations = @Authorization( value = "bearerAuth" ))

您会注意到 Swagger 中的操作旁边有一个锁图标 UI。目前没有。

顺便说一句。您应该使用较新的 OpenApiFeature 而不是旧的 Swagger2Feature。很高兴回答问题,如果你有问题。