2014-12-12 3 views
12

Я использую Swagger с Spring MVC. Я бы хотел выборочно отключить swagger в определенных средах (например, Production). Как я могу это сделать?Отключение Swagger с пружиной MVC

+0

Практически ничего. Я совершенно не знаком с Сваггером. Я пытался выяснить, будет ли настройка jacksonScalaSupport.setRegisterScalaModule (false) в SwaggerConfig работать – ConfusionPrevails

ответ

29

В случае, если вы используете версию 1.x из springfox ранее чванство-SpringMVC

При настройке чванство SpringMVC плагина вы можете использовать метод enable, к которому вы можете передать в логическом значении на основе среды/профиль и т.д.

@Bean 
public SwaggerSpringMvcPlugin customImplementation(){ 
    return new SwaggerSpringMvcPlugin(this.springSwaggerConfig) 
     .apiInfo(apiInfo()) 
     .enable(environmentSpeficicBooleanFlag) //<--- Flag to enable or disable possibly loaded using a property file 
     .includePatterns(".*pet.*"); 
} 

Другой способ сделать это с помощью пружинных профили

@Bean 
@Profile("production") 
public SwaggerSpringMvcPlugin customImplementation(){ 
    return new SwaggerSpringMvcPlugin(this.springSwaggerConfig) 
     .apiInfo(apiInfo()) 
     .enable(false) //<--- Flag set to false in the production profile 
     .includePatterns(".*pet.*"); 
} 

в случае, если вы используете 2 .x версия springfox

При настройке вашей развязность весна-MVC плагин вы можете использовать метод enable, к которому вы можете передать в логическое значение на основе среды/профиль и т.д.

@Bean 
public Docket customImplementation(){ 
    return new Docket(SWAGGER_2) 
     .apiInfo(apiInfo()) 
     .enable(environmentSpeficicBooleanFlag) //<--- Flag to enable or disable possibly loaded using a property file 
     .includePatterns(".*pet.*"); 
} 

Другой способ сделать он использует пружинные профили

@Bean 
@Profile("production") 
public Docket customImplementation(){ 
    return new Docket(SWAGGER_2) 
     .apiInfo(apiInfo()) 
     .enable(false) //<--- Flag set to false in the production profile 
     .includePatterns(".*pet.*"); 
} 
+0

Привет, Dilip, Спасибо за ответ. У меня была работа с использованием флага, специфичного для среды. Только если флаг является истинным, я вызываю метод initiallize() в моем пользовательском SwaggerSpringMvcPlugin. – ConfusionPrevails

+0

Не могли бы вы покончить с трюком свадьбы? См. Здесь: http://stackoverflow.com/documentation/swagger/commit – Stephan

+0

К сожалению, это не работает для меня с Spring 1.4.1 и Swagger 2.6.1, ошибка возникает до вызова методов конфигурации. –

3

Ответ Дилиппа - это то, о чем вы просили (я еще не проверял его). Но у меня есть дополнительный сценарий для решения проблемы, который может представлять интерес: в публичном ящике я хочу, чтобы документация была включена, но была закрыта.

Я добавил следующее к моей WebMvcConfigurerAdapter, который добавляет Basic Auth

@Override 
public void addInterceptors(InterceptorRegistry registry) { 
    registry.addInterceptor(new SwaggerInterceptor()) 
      .addPathPatterns("/api-docs"); 
} 

private class SwaggerInterceptor implements HandlerInterceptor { 
    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
     if (!authHeaderValid(request.getHeader("Authorization"))) { 
      response.addHeader("Access-Control-Allow-Origin", "null"); 
      response.addHeader("WWW-Authenticate", "Basic realm=\"\""); 
      response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
      response.getWriter().println("HTTP Status " + HttpServletResponse.SC_UNAUTHORIZED); 

      return false; 
     } 

     return true; 
    } 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } 

    @Override 
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } 

    private boolean authHeaderValid(String authorization) { 
     if (authorization != null && authorization.startsWith("Basic ")) { 
      final String[] values = new String(Base64.getDecoder().decode(authorization.substring("Basic ".length()))).split(":"); 

      return values[0].equals("username") && values[1].equals("password"); 
     } 

     return false; 
    } 
} 
+0

Это легче реализовать используя Spring Security вместо кодирования вашего собственного подхода к аутентификации? –

-1

Вы пытаетесь таким образом

@Configuration 
@EnableSwagger 
// Loads the spring beans required by the framework 
public class MySwaggerConfig 
{ 

    private SpringSwaggerConfig springSwaggerConfig; 

    /** 
    * Required to autowire SpringSwaggerConfig 
    */ 
    @Autowired 
    public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig) 
    { 
     this.springSwaggerConfig = springSwaggerConfig; 
    } 

    /** 
    * Every SwaggerSpringMvcPlugin bean is picked up by the swagger-mvc 
    * framework - allowing for multiple swagger groups i.e. same code base 
    * multiple swagger resource listings. 
    */ 
    @Bean 
    public SwaggerSpringMvcPlugin customImplementation() 
    { 
     return new SwaggerSpringMvcPlugin(this.springSwaggerConfig).apiInfo(apiInfo()).includePatterns(
       ".*?"); 
    } 

    private ApiInfo apiInfo() 
    { 
     ApiInfo apiInfo = new ApiInfo(
       "xx", 
       "xxxx", 
       "My Apps API terms of service", 
       "xxx", 
       null, 
       null); 
     return apiInfo; 
    } 
} 

ПОМ чванство-SpringMVC. veriosn является 0.9.5,

запуска сервера после запроса http://localhost:8080/appName/api-docs

+0

Как это отвечает на вопрос OP? –

+0

В этом ответе нет ничего, что объясняет, как Swagger можно включить/отключить на основе того, работает ли приложение в dev vs prod? –

Смежные вопросы