我正在尝试将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
使用此解决方案时,会出现招摇的用户界面,并且还会显示“自动”按钮。
我填写了身份验证表,然后,我尝试使用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的属性。
我想念什么?任何建议将不胜感激。 预先感谢。
答案 0 :(得分:0)
您可以简化代码,并删除ExtendedSwagger2Feature
和initializer()
。修改您的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
。如果您有疑问,很高兴回答问题。