使用Jersey 2和Spring Boot向Annotation驱动的swagger.json添加授权

时间:2017-04-27 07:30:27

标签: spring-boot jersey swagger swagger-ui

我正在尝试将基本身份验证添加到Swagger UI,以获得使用Spring Boot构建的Swagger-annotated Jersey 2.0 Web服务。我正在使用:

  • Spring Boot 1.5.4
  • spring-boot-starter-jersey
  • Swagger UI 3.0.4
  • (Maven包)swagger-jersey2-jaxrs 1.5.13

我能够在我的资源上使用以下JerseyConfig和Swagger注释生成swagger.json文件。 This article was immensely helpful in getting this far

@Component
public class JerseyConfiguration extends ResourceConfig {
  private static Log logger = LogFactory.getLog(JerseyConfiguration.class);

  @Value("${spring.jersey.application-path:/}")
  private String apiPath;

  public JerseyConfiguration() {
    registerEndpoints();
    configureSwagger();
  }

  private void registerEndpoints() {
    register(MyEndpoints.class);

    // Generate Jersey WADL at /<Jersey's servlet path>/application.wadl
    register(WadlResource.class);

    // Lets us get to static content like swagger
    property(ServletProperties.FILTER_STATIC_CONTENT_REGEX, "((/swagger/.*)|(.*\\.html))");
   }


  /**
   * Configure the Swagger documentation for this API.
   */
  private void configureSwagger() {
    // Creates file at localhost:port/swagger.json
    this.register(ApiListingResource.class);
    this.register(SwaggerSerializers.class);


    BeanConfig config = new BeanConfig();
    config.setConfigId("example-jersey-app");
    config.setTitle("Spring Boot + Jersey + Swagger");
    config.setVersion("2");
    config.setContact("Me <me@example.com>");
    config.setSchemes(new String[] {"http", "https"});
    config.setResourcePackage("com.example.api");
    config.setBasePath(this.apiPath);
    config.setPrettyPrint(true);
    config.setScan(true);
  }
}

现在我希望能够使用基本身份验证从Swagger UI连接到这些服务。我在Spring中配置它并可以使用它来验证网站,但不是来自Swagger UI。  不幸的是,Spring Boot examples currently on the Swagger sample site都没有包含Jersey和身份验证,并且没有一个Jersey示例使用Spring Boot和@SpringBootApplication,就像我在我的项目中使用的那样。

如何让Basic Auth显示在Swagger UI中?

1 个答案:

答案 0 :(得分:8)

我可以通过将ServletConfigAware添加到JerseyConfiguration来实现此功能。然后我可以使用Swagger Bootstrap.java examples中使用的相同样式的Swagger配置。

@Component
public class JerseyConfiguration extends ResourceConfig  implements ServletConfigAware{
  private ServletConfig servletConfig;

// ... this is all unchanged ...

  /**
   * Configure the Swagger documentation for this API.
   */
  private void configureSwagger() {
    // Creates file at localhost:port/swagger.json
    this.register(ApiListingResource.class);
    this.register(SwaggerSerializers.class);


    BeanConfig config = new BeanConfig();

// ... this is all unchanged ...

    config.setScan(true);

    Swagger swagger = new Swagger();
    swagger.securityDefinition("basicAuth", new BasicAuthDefinition());
    new SwaggerContextService().withServletConfig(servletConfig).updateSwagger(swagger);

  }

  @Override
  public void setServletConfig(ServletConfig servletConfig) {
    logger.info("Setting ServletConfig");
    this.servletConfig = servletConfig;
  }
}

进行这些更改后,将以下注释添加到我的端点:

@Api(value = "/api", description = "My super API",
authorizations = {@Authorization(value="basicAuth")})
@Path("api")
@Component
public class MyApi {

我看到了以下变化:

添加到我的swagger.json:

"securityDefinitions":{"basicAuth":{"type":"basic"}}
...
"security":[{"basicAuth":[]}]}}

此外,在Swagger UI中,一个新的绿色按钮出现在与Schemes下拉列表相同的行中,其中显示“Authorize”并打开了锁定。如果我点击它,弹出窗口会显示我可以输入用户名和密码的位置。现在,当我使用Swagger UI“试用”功能时,这些凭据会发送到API。