【问题标题】:In springdocs, can I define multiple OpenAPI definitions based on tags on the operations在springdocs中,我可以根据操作上的标签定义多个OpenAPI定义吗
【发布时间】:2020-12-22 00:53:43
【问题描述】:

我需要使用 springdocs 为单个应用程序中的同一个 API 定义两个不同的 OpenApi 定义:一个用于内部开发人员,一个用于外部开发人员。外部定义将包括内部定义中的一些操作,但不是全部。

我已经研究过使用 GroupedOpenApi 创建两个定义,但这需要我将应该从外部定义中排除的端点移动到单独的 RestController 并移动到一个排除的包,该包不会包含在定义中对于外部开发人员,但仍将包含在内部定义中。我更愿意基于 API 定义而不是基于端点的安全访问来构建我的代码。

这似乎可以使用 SecurityScheme 或标签来定义哪些操作包含在给定的定义中,使用诸如 GroupedOpenApi 之类的东西以及要包含的路径/包。因此,例如,我可以为我的外部 API 定义如下内容:

GroupedOpenApi.builder()
            .group("externalGroupName")
            .securitySchemesToInclude("externalSchemeName") // this doesn't currently exist
            .build();

然后,使用该 SecurityScheme 标记为 SecurityRequirement 的任何操作都将添加到此外部定义中。因此,例如,我可以在同一个 RestController 中定义以下两个端点:

将包括:

    @SecurityRequirement(name = "externalSchemeName")
    @GET
    @Path("/pets")
    public Response getResponse(){
        return null;
    }
}

不包括在内:

    @SecurityRequirement(name = "internalSchemeName")
    @GET
    @Path("/pets/internal")
    public Response getInternalResponse(){
        return null;
    }
}

使用这种方法,最好提供类似于路径/包包含/排除的包含/排除安全方案。

这似乎目前需要对 springdocs 做出贡献,除非我误解了如何创建多个定义的选项。是否有另一种方法可以实现仅从我定义的一个定义中排除操作,而不完全从所有定义中隐藏该操作并且不重组我的包?

请注意,如果可能,我也不希望在配置中维护应从组中排除的所有路径的列表,因为这容易出错并且不允许跨多个服务提供共享配置。我更喜欢一种类似于其他 swagger 自定义方式的注释驱动方法,以便我定义一次配置,然后在基于注释定义或修改时更新每个资源,以驱动生成的 swagger。

【问题讨论】:

    标签: springdoc


    【解决方案1】:

    以您为例,您还有其他未使用的 GroupedOpenApi 过滤器(基于路径):

        GroupedOpenApi.builder()
                .group("internalGroupName")
                .pathsToMatch("/pets/internal")
                .build();
    
        GroupedOpenApi.builder()
                .group("externalGroupName")
                .pathsToMatch("/pets")
                .packagesToExclude("/pets/internal")
                .build();
    

    【讨论】:

    • 我绝对可以调出配置中将被排除的所有路径,但这需要我在我的配置和代码中维护与 SecurityScheme 匹配的项目列表.这似乎容易出错,因为我可能会错过配置中的路径排除,但不会错过 SecurityScheme。我宁愿将访问控制的定义放在一个地方。
    • 另外,我认为在您的示例中,您的意思是“/pets/internal”的pathsToExclude,因为它不是一个包。我的两个示例端点都可能存在于同一个 RestController 中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 2021-07-15
    相关资源
    最近更新 更多