springdoc将安全性指定为打开

alen0pnh  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(427)

我用的是springdoc( 1.4.8 )记录我们的restapi。99%的呼叫是使用oauth2承载令牌进行安全保护的,因此我想在默认情况下添加如下内容:

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() 在默认情况下将显示为不安全的调用,但是我希望它们在默认情况下是安全的,并且只需要在不安全的情况下重写它。

sczxawaw

sczxawaw1#

我有一个类似的问题,我已经解决了它使用一个插件。插件将覆盖 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")

相关问题