如何用Swagger Java注解实现OpenAPI的A且B安全认证要求?
如何通过Swagger Java注解实现OpenAPI的多安全要求AND逻辑?
OpenAPI规范里明确:当在OpenAPI对象或操作对象上定义安全要求对象列表时,只要满足列表中任意一个安全要求就能授权请求(也就是OR逻辑)。但有一种特殊配置可以实现同时满足多个安全要求的AND逻辑,示例YAML如下:
security: # 需同时满足A和B(A AND B) - A B
这种配置要求请求必须同时通过A和B的校验才能被授权。
但尝试用Swagger Java注解实现时,不管是直接加两个@SecurityRequirement注解:
@SecurityRequirement(name = "A") @SecurityRequirement(name = "B")
还是用@SecurityRequirements包裹:
@SecurityRequirements(value = { @SecurityRequirement(name = "A"), @SecurityRequirement(name = "B") })
最终生成的都是OR逻辑的YAML:
security: # 满足A或B即可(A OR B) - A - B
完全达不到同时校验A和B的需求。
解决方案
目前Swagger Java注解(Swagger Core)没有提供直接的注解语法来生成包含多个安全方案的AND逻辑安全要求对象,但可以通过以下两种方式实现:
1. 全局配置(所有接口生效)
在OpenAPI配置类里手动构建包含AND逻辑的安全要求:
@Configuration public class OpenApiConfig { @Bean public OpenAPI customOpenAPI() { return new OpenAPI() // 先定义安全方案A和B(根据实际认证方式调整) .components(new Components() .addSecuritySchemes("A", new ApiKeyAuth() .in(In.HEADER) .name("X-AUTH-TOKEN")) .addSecuritySchemes("B", new HttpBearerAuth() .scheme("bearer"))) // 添加包含A和B的单个安全要求对象,实现AND逻辑 .addSecurityItem(new SecurityRequirement() .addList("A") .addList("B")); } }
2. 接口/方法级别配置(仅特定接口生效)
如果只需要在部分接口上应用AND逻辑,可以通过@OperationCustomizer来修改目标操作的安全要求:
首先创建一个自定义注解用来标记需要AND逻辑的方法:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface RequireAndSecurity {}
然后在配置类中实现自定义逻辑:
@Configuration public class OpenApiConfig { @Bean public OperationCustomizer andSecurityRequirementCustomizer() { return (operation, handlerMethod) -> { // 检查当前方法是否标记了自定义注解 if (handlerMethod.hasMethodAnnotation(RequireAndSecurity.class)) { // 创建包含A和B的安全要求对象 SecurityRequirement andRequirement = new SecurityRequirement() .addList("A") .addList("B"); // 替换原有安全要求为AND逻辑的配置 operation.setSecurity(List.of(andRequirement)); } return operation; }; } }
最后在需要的接口方法上添加自定义注解即可:
@GetMapping("/protected-and") @RequireAndSecurity public ResponseEntity<String> protectedAndEndpoint() { return ResponseEntity.ok("此接口需同时通过A和B认证"); }
如果使用的是Springdoc OpenAPI(基于Swagger Core的Spring整合库),也可以用类似的编程方式实现。
内容的提问来源于stack exchange,提问作者Ziheng Cai
相关产品推荐
相关产品推荐

