首页 > 解决方案 > Springdoc 将安全性指定为打开

问题描述

我正在使用 Springdoc ( 1.4.8) 来记录我们的 Rest API。99% 的调用都是使用 OAuth2 Bearer Token 保护的,所以我想默认添加它,如下所示:

new OpenAPI()
            .components(new Components()
            .addSecuritySchemes("bearerTokenScheme",
                            new SecurityScheme()
                                    .type(SecurityScheme.Type.HTTP)
                                    .name("bearerTokenScheme")
                                    .scheme("Bearer")
                                    .bearerFormat("JWT")
                    )
              )
            .addSecurityItem(new SecurityRequirement()
                    .addList("bearerTokenScheme")
            )

默认情况下指定它很好,但我现在的问题是,我可以通过指定一个不安全的调用来以某种方式否决它吗?

我确实意识到默认情况下省略.addSecurityItem()会将调用显示为不安全,但我希望默认情况下它们是安全的,并且只有在不安全时才需要覆盖它。

标签: javaspringswaggeropenapispringdoc

解决方案


我有一个类似的问题,我已经使用插件解决了它。该插件覆盖security标记控制器或方法的值并将其设置为空列表。所以标记的端点仍然是不安全的。

@Component
public class NoSecurityPlugin implements OpenApiCustomiser {

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

    private static final List<String> tagsForNoSecurity = List.of(
            "public", "unsecured"
    );

    @Override
    public void customise(OpenAPI openApi) {
        openApi.getPaths().forEach((path, item) -> getOperations(item).forEach(api -> {
           List<String> tags = api.getTags();
           if(tags != null && tags.stream().anyMatch(tagsForNoSecurity::contains)) {
               api.setSecurity(Collections.emptyList());
           }
       }));
    }

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

标记您的 API 方法(或Controller):

@Tag(name = "public", description = "Public APIs")

推荐阅读