【问题标题】:Swagger openapi: Filter methods in openapi.yaml/ swagger-uiSwagger openapi:openapi.yaml/swagger-ui 中的过滤方法
【发布时间】:2021-03-24 23:12:42
【问题描述】:

我已将我的 Jersey REST 服务文档升级到 swagger openapi v3。

现在我想介绍一种按用户授权过滤方法,以便在 swagger-ui/openapi.yaml 文档中只显示特定的 API 方法。 我最接近的是使用扩展 io.swagger.v3.core.filter.AbstractSpecFilter 的过滤器类 ApiAuthorizationFilterImpl。

public class ApiAuthorizationFilterImpl extends AbstractSpecFilter {
    
    @Override
    public Optional<Operation> filterOperation(
            Operation operation,
            ApiDescription api,
            Map<String, List<String>> params,
            Map<String, String> cookies,
            Map<String, List<String>> headers) {

            System.out.println("Operation filter is being executed");
            return Optional.of(operation);
}

我已将球衣过滤器类中使用的过滤器添加到 web.xml 中。

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>io.swagger.v3.jaxrs2.integration.resources</param-value>
    </init-param>    
    <init-param>
      <param-name>jersey.config.server.provider.classnames</param-name>
      <param-value>com.mapchart.core.ws.swagger.ApiAuthorizationFilterImpl</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

之后似乎没有执行过滤器,我将其添加到 openapi.yaml 中,如 here 所述:

prettyPrint: true
cacheTTL: 0
filterClass: ApiAuthorizationFilterImpl
openAPI:
  info:
    version: '1.0.0'
    title: 'OpenAPI documentation'
  servers:
    - url: '/my-rest-service'

由于这似乎也没有执行过滤器,我想知道实际上如何添加对 openapi 方法的过滤以显示在 openapi.yaml/swagger-ui 中(使用 AbstractSpecFilter 或其他方式)?

【问题讨论】:

    标签: java jersey-2.0 openapi swagger-2.0


    【解决方案1】:

    必须将 filterClass 指定为完全限定的类名才能执行,正如我在这里发现的那样:https://*.com/a/68482434/3271380

    此外,我必须添加一些变通方法以使过滤器适用于用户身份验证:

    • 向@Operation 方法添加自定义参数,在我的例子中,我使用了带有自定义值的SecurityRequirement(使用隐藏参数或@Hidden 注释不起作用,因为Swagger 会在执行此过滤器之前静态过滤掉这些方法)
    • 在 ContainerRequestFilter 中添加有关用户类型的自定义标头,该标头在执行此过滤器之前执行。这样,可以在 ApiAuthorizationFilterImpl 类中检索该标头。

    【讨论】: