gpt4 book ai didi

java - springdoc-openapi 应用默认的全局 SecurityScheme 可能吗?

转载 作者:行者123 更新时间:2023-12-01 17:28:46 26 4
gpt4 key购买 nike

我有以下SecurityScheme使用 springdoc-openapi 为 java SpringBoot RESTful 应用程序定义:

    @Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.components(new Components().addSecuritySchemes("bearer-jwt",
new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("bearer").bearerFormat("JWT")
.in(SecurityScheme.In.HEADER).name("Authorization")))
.info(new Info().title("App API").version("snapshot"));
}

是否可以将其全局应用到所有路径,而不必添加 @SecurityRequirement @Operation 的注释代码中到处都是注释?

如果是,如何向不安全路径添加排除项?

最佳答案

是的,您可以在同一位置调用addSecurityItem:

  @Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.components(new Components().addSecuritySchemes("bearer-jwt",
new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("bearer").bearerFormat("JWT")
.in(SecurityScheme.In.HEADER).name("Authorization")))
.info(new Info().title("App API").version("snapshot"))
.addSecurityItem(
new SecurityRequirement().addList("bearer-jwt", Arrays.asList("read", "write")));
}

全局安全架构可以通过使用 @SecurityRequirements 注释的不同架构来覆盖。包括删除操作的安全模式。例如,我们可以删除注册路径的安全性。

@SecurityRequirements
@PostMapping("/registration")
public ResponseEntity post(@RequestBody @Valid Registration: registration) {
return registrationService.register(registration);
}

同时仍保留其他 API 的安全架构。

旧答案(2019 年 12 月 20 日):

全局安全架构可以通过使用 @SecurityRequirements 注释的不同架构来覆盖。但对于不安全的路径无法将其删除。 springdoc-openapi 中实际上缺少功能,OpenAPI 标准允许这样做。请参阅disable global security for particular operation

不过有一个解决方法。 springdoc-openapi 有一个 OpenApiCustomiser 的概念,可用于拦截生成的模式。在定制器内,可以通过编程方式修改操作。要删除任何继承的安全性,需要将字段 security 设置为空数组。该逻辑可以基于任何任意规则,例如操作名称。我使用了标签。

定制器:

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.PathItem;
import org.springdoc.api.OpenApiCustomiser;
import org.springframework.stereotype.Component;

import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Component
public class SecurityOverrideCustomizer implements OpenApiCustomiser {

public static final String UNSECURED = "security.open";

private static final List<Function<PathItem, Operation>> OPERATION_GETTERS = Arrays.asList(
PathItem::getGet, PathItem::getPost, PathItem::getDelete, PathItem::getHead,
PathItem::getOptions, PathItem::getPatch, PathItem::getPut);

@Override
public void customise(OpenAPI openApi) {
openApi.getPaths().forEach((path, item) -> getOperations(item).forEach(operation -> {
List<String> tags = operation.getTags();
if (tags != null && tags.contains(UNSECURED)) {
operation.setSecurity(Collections.emptyList());
operation.setTags(filterTags(tags));
}
}));
}

private static Stream<Operation> getOperations(PathItem pathItem) {
return OPERATION_GETTERS.stream()
.map(getter -> getter.apply(pathItem))
.filter(Objects::nonNull);
}

private static List<String> filterTags(List<String> tags) {
return tags.stream()
.filter(t -> !t.equals(UNSECURED))
.collect(Collectors.toList());
}
}

现在我们可以将@Tag(name = SecurityOverrideCustomizer.UNSECURED)添加到不安全的方法中:

    @Tag(name = SecurityOverrideCustomizer.UNSECURED)
@GetMapping("/open")
@ResponseBody
public String open() {
return "It works!";
}

请记住,这只是一种解决方法。希望这个问题能够在下一个 springdoc-openapi 版本中得到解决(在撰写本文时,当前版本是 1.2.18)。

有关工作示例,请参阅 springdoc-security-override-fix

关于java - springdoc-openapi 应用默认的全局 SecurityScheme 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59357205/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com