【Java】Spring SecurityのCORS設定で許可するオリジンを環境変数から読み込む

CORS設定で許可するオリジンを環境変数から読み込む

以下の記事で作成したSpring SecurityのCORS設定に対して、アクセスを許可するオリジンを環境変数から読み込む処理を追加します。

CORS設定を行っている箇所を抜粋します。コメントで記述した箇所は修正前は「*」とハードコーディングされています。オリジンの設定を柔軟に変更できるようにするために、デプロイ先の環境変数から読み込むように修正します。

    // CORS設定を行うBean定義
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        var configuration = new CorsConfiguration();

        // Access-Control-Allow-Origin
     // 「*」となっているが環境変数から読み込むように変更する
        configuration.setAllowedOrigins(List.of("*"));
 
        // Access-Control-Allow-Methods
        configuration.setAllowedMethods(List.of("*"));

        // Access-Control-Allow-Headers
        configuration.setAllowedHeaders(List.of("*"));

        // Access-Control-Allow-Credentials
        configuration.setAllowCredentials(true);

        var source = new UrlBasedCorsConfigurationSource();

       // COSR設定を行う範囲のパスを指定する。この例では全てのパスに対して設定が有効になる
        source.registerCorsConfiguration("/**", configuration);

        return source;
    }

以下のように修正しました。

corsConfigurationSourceのBean定義の引数に@Valueを使用することでapplication.yml中のキー「allowed-origins」から値を読み込むようにします。

環境変数ALLOWED_ORIGINSには 「example1.com,example2.com」のようにカンマ区切りでホスト名を指定します。全て許可する場合は「*」を指定します。

もし、キー「allowed-origins」が定義されていない場合はデフォルト値を「*」とします。

convertAllowedOriginsメソッドを作成しキー「allowed-origins」から読み込んだ値に対してUriComponentsBuilderを使用してスキームを追加します。読み込んだ値が「*」の場合は「*」 のままにします。

    // @Valueを用いてapplication.yml中のallowed-originsの値を取得する。
    @Bean
    public CorsConfigurationSource corsConfigurationSource(@Value("${allowed-origins:*}") String[] allowedOrigins) {
        var configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(convertAllowedOrigins(allowedOrigins));
        configuration.setAllowedMethods(List.of("*"));
        configuration.setAllowedHeaders(List.of("*"));
        configuration.setAllowCredentials(true);

        var source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);

        return source;
    }

  // 環境変数に記述されたホスト名(例:example.com)をhttp://example.comのように
   // スキーマをつけた形式へ変換する
    private List<String> convertAllowedOrigins(String[] allowedOrigins) {

        // 値が空の場合はエラーとする
        if (allowedOrigins.length == 0) {
            throw new IllegalArgumentException();
        }

        // 「*」 が設定されている場合は「*」のまま返す
        if (allowedOrigins.length == 1 && allowedOrigins[0].equals("*")) {
            return List.of("*");
        }

    // ホスト名にスキームをつける
       return Arrays.stream(allowedOrigins).map(i -> UriComponentsBuilder.newInstance().host(i).scheme("http").build().toUriString()).collect(Collectors.toList());
    }

application.ymlに環境変数ALLOWED_ORIGINSから値を記述するように設定を追加します。

spring:
  mvc:
    throw-exception-if-no-handler-found: true
  resources:
    add-mappings: false

# 環境変数ALLOWED_ORIGINSから値を取得する。
allowed-origins: ${ALLOWED_ORIGINS}

Java,Spring

Posted by fanfanta