Springboot,CXF 3.2.7,Swagger2功能:授权标头未出现在请求标头中

时间:2019-01-04 15:04:02

标签: spring-boot authentication swagger cxf swagger-ui

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

我尝试了很多教程,CXF official documentation,还有其他教程(例如Spring Boot, Apache CXF, Swagger under JAX-RS)。 昂首阔步的官方网站对我没有帮助。 The swagger OpenAPI 2.0 authentication doc无效,请提高the OpenAPI 3.0

它不适用于Open API 3.0.0的组件方案,因此我坚持使用apiKeyDefinition。

正在工作的那个可以在@Naoj的答案中的此线程中找到: CXF Swagger2Feature adding securityDefinitions

使用此解决方案时,会出现招摇的用户界面,并且还会显示“自动”按钮。 enter image description here

我填写了身份验证表,然后,我尝试使用swagger-ui发送请求。问题是,授权标头没有出现在请求中,所以我得到了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>

我的招摇配置如下:

@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);
        };
    }
}

扩展的招摇功能如下:

@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类中,如下所示:

@Import(SwaggerConfig.class)

正如我所见,它正在工作,招摇出现,并且标题和说明字段充满了yml的属性。

我想念什么?任何建议将不胜感激。 预先感谢。

1 个答案:

答案 0 :(得分:0)

您可以简化代码,并删除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。如果您有疑问,很高兴回答问题。