springdoc-openapi-ui 添加 JWT header 参数到生成的 swagger

springdoc-openapi-ui add JWT header parameter to generated swagger

在我的 spring 启动应用程序中,我的端点由 spring 启动应用程序中的 header 参数验证。 当前的 swagger json 看起来像这样:

// part of current swagger.json
...
  "paths": {
    "/path1/{param1}": {
      "get": {
        "parameters": [
          {
            "name": "param1",
            "in": "path",
            "type": "string",
            "required": true
          }
        ]
      }
    }
  }
...

我想使用 springdoc-openapi-ui 配置添加缺少的参数,因此它看起来像这样:

// I want to achieve swagger.json which contains additional parameter
...
  "paths": {
    "/path1/{param1}": {
      "get": {
        "parameters": [
          {
            "name": "param1",
            "in": "path",
            "type": "string",
            "required": true
          },
          {
            "name": "missingParam",
            "in": "header",
            "type": "string",
            "required": true
          }
        ]
      }
    }
  }
...

我尝试通过将 Common Parameters for Various Paths

添加到我的 appplication.yml 解决方案来实现这一点
#application.yml
...
components:
  parameters:
    hiddenParam:
      in: header
      name: missingParam
      required: true
      schema:
        type: string
paths:
  /path1:
    get:
      parameters:
        - $ref: '#/components/parameters/hiddenParam'

但是没用。

我的问题:

  1. 有没有办法使用应用程序配置修改我的 swagger 结果?
  2. 我想定义参数模板并将其添加到所有端点,我该如何实现?

您可以使用 OperationCustomizer 添加全局参数,例如 header,如下所示。这会将您的 parameter 添加到每个服务

@Configuration
public class SwaggerConfiguration {

    @Bean
    public OperationCustomizer customGlobalHeaders() {

        return (Operation operation, HandlerMethod handlerMethod) -> {

            Parameter missingParam1 = new Parameter()
                    .in(ParameterIn.HEADER.toString())
                    .schema(new StringSchema())
                    .name("missingParam1")
                    .description("header description2")
                    .required(true);
                    
            Parameter missingParam2 = new Parameter()
                    .in(ParameterIn.HEADER.toString())
                    .schema(new StringSchema())
                    .name("missingParam2")
                    .description("header description2")
                    .required(true);

            operation.addParametersItem(missingParam1);
            operation.addParametersItem(missingParam2);

            return operation;
        };
    }
}

最后我决定使用不同的方法。 我定义了 security scheme and applied it globally as authorization header.

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("My App").version("1.0.0"))
                // Components section defines Security Scheme "mySecretHeader"
                .components(new Components()
                        .addSecuritySchemes("mySecretHeader", new SecurityScheme()
                                .type(SecurityScheme.Type.APIKEY)
                                .in(SecurityScheme.In.HEADER)
                                .name("missingParam")))
                // AddSecurityItem section applies created scheme globally
                .addSecurityItem(new SecurityRequirement().addList("mySecretHeader"));
    }

现在 swagger-ui.html 允许根据测试人员的要求在授权 header 或不授权的情况下测试端点。

干杯!