升级Dropwizard Swagger后Swagger页面无API_KEY输入框问题
升级Dropwizard Swagger后API_KEY输入框消失的解决方法
升级Dropwizard及Swagger依赖后,Swagger页面的API_KEY输入框不再显示,无法输入OAuth令牌。原依赖与升级后依赖如下:
原Maven依赖:
<dependencies> <dependency> <groupId>io.dropwizard</groupId> <artifactId>dropwizard-core</artifactId> <version>0.8.0</version> </dependency> <dependency> <groupId>io.federecio</groupId> <artifactId>dropwizard-swagger</artifactId> <version>0.7.0</version> </dependency> </dependencies>
升级后Maven依赖:
<dependency> <groupId>io.dropwizard</groupId> <artifactId>dropwizard-core</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>com.smoketurner</groupId> <artifactId>dropwizard-swagger</artifactId> <version>2.0.12-1</version> </dependency>
原因与解决方案
新版com.smoketurner:dropwizard-swagger基于OpenAPI 3.0规范,不再默认启用API_KEY授权输入框,需要显式配置安全方案来恢复授权功能。
步骤1:配置Swagger安全方案
在Application类的initialize方法中,为SwaggerBundleConfiguration添加SecurityScheme和SecurityContext配置:
示例1:API_KEY(Header令牌)配置
@Override public void initialize(Bootstrap<YourAppConfiguration> bootstrap) { // 初始化Swagger配置 SwaggerBundleConfiguration swaggerConfig = new SwaggerBundleConfiguration(); // 定义API_KEY类型的安全方案 SecurityScheme apiKeyScheme = new SecurityScheme() .type(SecurityScheme.Type.APIKEY) .name("Authorization") // 请求头中的令牌字段名,如Bearer令牌使用Authorization .in(SecurityScheme.In.HEADER); // 注册安全方案 Map<String, SecurityScheme> securitySchemes = new HashMap<>(); securitySchemes.put("api_key", apiKeyScheme); swaggerConfig.setSecuritySchemes(securitySchemes); // 全局启用该安全方案(可选,也可仅在特定接口启用) SecurityRequirement securityReq = new SecurityRequirement(); securityReq.addList("api_key"); swaggerConfig.setSecurityContexts(Collections.singletonList(securityReq)); // 基础Swagger配置 swaggerConfig.setTitle("你的API名称"); swaggerConfig.setVersion("1.0.0"); swaggerConfig.setResourcePackage("com.yourcompany.api.resources"); // 你的API资源包路径 // 添加Swagger Bundle bootstrap.addBundle(new SwaggerBundle<YourAppConfiguration>() { @Override protected SwaggerBundleConfiguration getSwaggerBundleConfiguration(YourAppConfiguration configuration) { return swaggerConfig; } }); }
示例2:OAuth2隐式授权配置
如果需要OAuth2授权输入框,可替换SecurityScheme为:
SecurityScheme oAuth2Scheme = new SecurityScheme() .type(SecurityScheme.Type.OAUTH2) .flow(SecurityScheme.Flow.IMPLICIT) .authorizationUrl("https://你的授权服务器地址/oauth/authorize") // 授权地址 .scopes(new Scopes() .addString("read:api", "读取API数据权限") .addString("write:api", "写入API数据权限")); securitySchemes.put("oauth2", oAuth2Scheme); securityReq.addList("oauth2");
步骤2:为接口添加安全要求(可选)
如果不需要全局启用授权,可在单个Resource类或方法上添加@SecurityRequirement注解,指定使用的安全方案:
@Path("/users") @Produces(MediaType.APPLICATION_JSON) @SecurityRequirement(name = "api_key") // 启用api_key安全方案 public class UserResource { // 接口方法... }
完成配置后重启服务,Swagger页面会显示Authorize按钮,点击后即可输入API令牌或进行OAuth授权。
内容的提问来源于stack exchange,提问作者Pradip Patel
相关产品推荐
相关产品推荐

