web-dev-qa-db-ja.com

Spring Data RestおよびCors

RestインターフェースとDartを前面に配置したSpring Bootアプリケーションを開発しています。

XMLHttpRequestはOPTIONS要求を実行しますが、これは完全に正しく処理されます。この後、最後のGET( "/ products")リクエストが発行され、失敗します:

要求されたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。 Origin ' http:// localhost:6334 'はアクセスを許可されません。

デバッグ後、次のことがわかりました。RepositoryRestHandlerMappingを除くすべてのサブクラスについて、AbstractHandlerMapping.corsConfigurationが設定されています。 RepositoryRestHandlerMappingには、作成時にcorsConfigurationが存在しない/設定されないため、corsパス/リソースとして認識されません。
=> CORSヘッダーは添付されていません
それが問題になりますか?どうすれば設定できますか?

構成クラス:

@Configuration
public class RestConfiguration extends RepositoryRestMvcConfiguration {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowCredentials(false).allowedOrigins("*").allowedMethods("PUT", "POST", "GET", "OPTIONS", "DELETE").exposedHeaders("Authorization", "Content-Type");
    }

   ...
}

アノテーションごとにCorsを設定しようとしました:

@CrossOrigin( methods = RequestMethod.GET, allowCredentials = "false")
public interface ProductRepository extends CrudRepository<Product, String> {


}

生のリクエストヘッダー:

GET /products HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
authorization: Basic dXNlcjpwYXNzd29yZA==
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/43.0.2357.130 Chrome/43.0.2357.130 Safari/537.36
Content-Type: application/json
Accept: */*
Referer: http://localhost:63343/inventory-web/web/index.html
Accept-Encoding: gzip, deflate, sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4

生の応答ヘッダー:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/hal+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Thu, 30 Jul 2015 15:58:03 GMT

使用バージョン:Spring Boot 1.3.0.M2 Spring 4.2.0.RC2

私は何が恋しいですか?

52
Thomas Letsch

実際、Spring Data REST 2.6(Ingalls)より前は、Spring MVC HandlerMapping@CrossOriginアノテーションが付けられたコントローラーによって作成されたWebMvcConfigurationSupportインスタンスのみがCORSに対応していました。

しかし、今では DATAREST-57 が修正され、RepositoryRestConfigurationがグローバルセットアップ用にgetCorsRegistry()を公開し、リポジトリ上の@CrossOrigin注釈も認識されるため、これが推奨されるアプローチです。具体的な例については、 https://stackoverflow.com/a/42403956/1092077 answerをご覧ください。

Spring Data REST 2.5(Hopper)以前のバージョンに固執しなければならない人にとって、最善の解決策はフィルターベースのアプローチを使用することだと思います。 Tomcat、Jetty、または this one を使用できますが、Spring Framework 4.2では、@CrossOriginおよびaddCorsMappings(CorsRegistry registry)アプローチと同じCORS処理ロジックを使用する CorsFilter も提供されることに注意してください。 UrlBasedCorsConfigurationSource インスタンスをCorsFilterコンストラクターパラメーターに渡すことで、SpringネイティブCORSグローバルサポートと同じくらい強力なものを簡単に取得できます。

Filter Beanをサポートする)Spring Bootを使用している場合、次のようになります。

@Configuration
public class RestConfiguration {

    @Bean
    public FilterRegistrationBean corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration().applyPermitDefaultValues();
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(0);
        return bean;
    }
}
94

Ingallsトレインが実現された であるため、Spring DataでのCORSのサポートが有効になりました。対処するには2つの方法があります。

  1. @CrossOriginインターフェースでoriginsmethods、およびallowedHeadersを指定した@RepositoryRestResourceアノテーション。

    @CrossOrigin(...)
    @RepositoryRestResource
    public interface PageRepository extends CrudRepository<Page, Long> { ... }
    
  2. @Configurationクラス内にRepositoryRestConfigurationを含むグローバル構成。 @CrossOriginでリポジトリをマークする必要はありません。

    @Configuration
    public class GlobalRepositoryRestConfigurer extends RepositoryRestConfigurerAdapter {
    
        @Override
        public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
            config.getCorsRegistry()
                      .addMapping(CORS_BASE_PATTERN)
                      .allowedOrigins(ALLOWED_ORIGINS)
                      .allowedHeaders(ALLOWED_HEADERS)
                      .allowedMethods(ALLOWED_METHODS);
         }
    
    }
    
17
Andrew Tobilko

何らかの理由で、Spring Boot 1.5.2から1.5.6にアップグレードした後、上記の受け入れられた回答で提案されたアプローチが機能しませんでした。

@BigDongのコメントでも指摘されているように、私が得た例外は次のとおりです。

BeanInstantiationException:[javax.servlet.Filter]のインスタンス化に失敗しました:ファクトリメソッド 'springSecurityFilterChain'は例外をスローしました。ネストされた例外はorg.springframework.beans.factory.BeanNotOfRequiredTypeExcep‌tionです:「corsFilter」という名前のBeanは「org.springframework.web.filter.CorsFilter」型であることが期待されていますが、実際は「org.springframework.boot.web」型でした.servlet.FilterRegistrationBean

そこで、Spring Data RestまたはSpring MVCを使用して実装されているかどうかに関係なく、REST AP​​Iのすべてのエンドポイントに対して「グローバル」CORS構成を取得するために、すべてのエンドポイントをSpring Securityで保護します。

CorsFilterを適切な時点でリクエストパイプラインにフックできなかったため、代わりにSDRとMVCを個別に構成しましたが、このヘルパーを介してCorsRegistryに同じ構成を使用しました。

public static void applyFullCorsAllowedPolicy(CorsRegistry registry) {
    registry.addMapping("/**") //
            .allowedOrigins("*") //
            .allowedMethods("OPTIONS", "HEAD", "GET", "PUT", "POST", "DELETE", "PATCH") //
            .allowedHeaders("*") //
            .exposedHeaders("WWW-Authenticate") //
            .allowCredentials(true)
            .maxAge(TimeUnit.DAYS.toSeconds(1));
}

そして、MVCの場合:

@Configuration
@EnableWebSecurity(debug = true)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class CustomWebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // enables CORS as per
        // https://docs.spring.io/spring-security/site/docs/current/reference/html/cors.html#cors
        http.cors()
            .and() // ...
    }

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                applyFullCorsAllowedPolicy(registry);
            }
        };
    }
}

そして、SDRの場合:

public class CustomRepositoryRestMvcConfiguration extends RepositoryRestConfigurerAdapter {

@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
    config.setReturnBodyOnCreate(true);
    config.setReturnBodyForPutAndPost(true);
    config.setReturnBodyOnUpdate(true);
    config.setMaxPageSize(250);
    config.setDefaultPageSize(50);
    config.setDefaultMediaType(MediaTypes.HAL_JSON);
    config.useHalAsDefaultJsonMediaType(true);

    CustomWebSecurityConfiguration.applyFullCorsAllowedPolicy(config.getCorsRegistry());
}

この答えを思い付くのに役立った主題に関するいくつかのさらなる参照があります:

8

私は角から春休みサービスを打とうとしていました。 TomcatサーバーにデプロイされたSpring restプロジェクトで、angularはデフォルトのangularサーバーです。 angularからサービスにアクセスするときにこの問題に直面しました。フォローしようとした

https://juristr.com/blog/2016/11/configure-proxy-api-angular-cli/

問題はまだあります。シニアの 'Abbas bhai'のおかげで、この問題を回避するために、スプリング構成ファイルにいくつかの構成を追加してくださいと提案したので、このコードをスプリング構成に追加しました。

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
@EnableWebMvc
@ComponentScan("org.liferayasif.backend")
public class RestConfig extends WebMvcConfigurerAdapter{

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){
        configurer.enable();
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter#addCorsMappings(org.springframework.web.servlet.config.annotation.CorsRegistry)
     * To avoid 'Access-Control-Allow-Origin'
     * Above error arising when I am hitting from angular to our rest service
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }

}

この方法により、「Access-Control-Allow-Origin」CORが解決されました。

@Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }

参考のため、プロジェクト全体をダウンロードできます

私のgithub urlリンク:

https://github.com/asifaftab87/SpringPersistenceHibernate

支店-セキュリティ

プロジェクト-モデル

0
asifaftab87