1. 概要

Swaggerユーザーインターフェイスを使用すると、RESTサービスに関する情報を表示できます。 これは開発に非常に便利です。 ただし、セキュリティ上の懸念から、パブリック環境でこの動作を許可したくない場合があります。

この短いチュートリアルでは、方法本番環境でSwaggerをオフにする方法について説明します。

2. Swagger構成

SwaggerをSpringでセットアップするには、構成Beanで定義します。

SwaggerConfigクラスを作成しましょう。

@Configuration
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer {

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2).select()
                .apis(RequestHandlerSelectors.basePackage("com.baeldung"))
                .paths(PathSelectors.regex("/.*"))
                .build();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

デフォルトでは、この構成Beanは常にSpringコンテキストに挿入されます。 したがって、Swaggerはすべての環境で使用できるようになります。

本番環境でSwaggerを無効にするには、この構成beanを挿入するかどうかを切り替えましょう。

3. Springプロファイルの使用

Springでは、 @Profileアノテーションを使用して、Beanの注入を有効または無効にできます。

SpEL式を使用して「swagger」プロファイルと一致させてみましょう。ただし、「prod」プロファイルとは一致させません。

@Profile({"!prod && swagger"})

これにより、Swaggerをアクティブ化する環境について明示的にする必要があります。 また、本番環境で誤ってオンにするのを防ぐのにも役立ちます。

構成に注釈を追加できます。

@Configuration 
@Profile({"!prod && swagger"})
@EnableSwagger2 
public class SwaggerConfig implements WebMvcConfigurer {
    ...
}

次に、 spring .profiles.active プロパティの設定を変えてアプリケーションを起動し、動作することをテストしましょう。

  -Dspring.profiles.active=prod // Swagger is disabled

  -Dspring.profiles.active=prod,anyOther // Swagger is disabled

  -Dspring.profiles.active=swagger // Swagger is enabled

  -Dspring.profiles.active=swagger,anyOtherNotProd // Swagger is enabled

  none // Swagger is disabled

4. 条件文の使用

スプリングプロファイルは、フィーチャートグルのソリューションとしては粗すぎる可能性があります。 このアプローチは、構成エラーや、長くて管理しにくいプロファイルのリストにつながる可能性があります。

別の方法として、 @ConditionalOnExpression を使用できます。これにより、Beanを有効にするためのカスタムプロパティを指定できます。

@Configuration
@ConditionalOnExpression(value = "${useSwagger:false}")
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer {
    ...
}

useSwagger」プロパティが欠落している場合、ここでのデフォルトはfalseです。

これをテストするには、 application.properties (または application.yaml )ファイルでプロパティを設定するか、VMオプションとして設定します。

-DuseSwagger=true

この例には、本番インスタンスで誤ってuseSwaggertrueに設定されないことを保証する方法が含まれていないことに注意してください。

5. 落とし穴の回避

Swaggerを有効にすることがセキュリティ上の懸念事項である場合は、間違いがなく、使いやすい戦略を選択する必要があります。

@Profile を使用すると、一部のSpEL式がこれらの目的に反する可能性があります。

@Profile({"!prod"}) // Leaves Swagger enabled by default with no way to disable it in other profiles
@Profile({"swagger"}) // Allows activating Swagger in prod as well
@Profile({"!prod", "swagger"}) // Equivalent to {"!prod || swagger"} so it's worse than {"!prod"} as it provides a way to activate Swagger in prod too

これが、@Profileの例で使用した理由です。

@Profile({"!prod && swagger"})

このソリューションは、Swaggerを作成するため、おそらく最も厳密です。 デフォルトで無効になっており、それを保証しますで有効にすることはできません 「製品」。 

6. 結論

この記事では、 Swaggerを無効にする生産中。

@Profileおよび@ConditionalOnExpressionアノテーションを使用して、SwaggerをオンにするBeanを切り替える方法を確認しました。 また、設定ミスや望ましくないデフォルトから保護する方法についても検討しました。

いつものように、この記事のサンプルコードは、GitHubにあります。