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 的属性。
我错过了什么?任何建议将不胜感激。
提前致谢。
您可以简化代码并删除 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
。很高兴回答问题,如果你有问题。
我正在尝试将 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 的属性。
我错过了什么?任何建议将不胜感激。 提前致谢。
您可以简化代码并删除 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
。很高兴回答问题,如果你有问题。