问题描述
我需要使用springdocs为单个应用程序中的同一API定义两个不同的OpenApi定义:一个内部开发人员,一个外部开发人员。外部定义将包括内部定义中的某些操作,但不是全部。
我研究过使用GroupedOpenApi创建两个定义,但这要求我将应从外部定义中排除的端点移至单独的RestController中,并移至排除的包,该包将不包含在定义中对于外部开发人员,但仍将包含在内部定义中。我宁愿根据API定义而不是根据对端点的安全性访问来构造代码。
似乎可以使用GroupedOpenApi之类的东西,使用SecurityScheme或标签来定义给定定义中包括哪些操作,以及要包含的路径/包。因此,例如,我可以使用以下内容为我的外部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。
解决方法
使用您的示例,您还没有使用GroupedOpenApi的其他过滤器(基于路径):
GroupedOpenApi.builder()
.group("internalGroupName")
.pathsToMatch("/pets/internal")
.build();
GroupedOpenApi.builder()
.group("externalGroupName")
.pathsToMatch("/pets")
.packagesToExclude("/pets/internal")
.build();