You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 13:35:24