2016-07-07 61 views
2

我使用spring安全性與OAuth2(版本:4.0.4.RELEASE)和spring(verison:4.3.1.RELEASE)。Spring Security CORS過濾器不起作用

我正在開發Angular的前端,我正在使用grunt connect:dev(http://127.0.0.1:9000)。當我試圖登錄本地主機地址一切工作正常,但其他我收到提示:

「的XMLHttpRequest無法加載http://localhost:8084/oauth/token?client_id=MY_CLIENT_ID迴應預檢要求未通過訪問控制檢查:沒有「訪問控制 - 允許 - Origin'標題出現在請求的資源上,因此Origin'http://127.0.0.1:9000'不允許訪問,響應的HTTP狀態碼爲401.「

我在WebMvcConfigurerAdapter(如下)中配置了映射(覆蓋public void addCorsMappings(CorsRegistry註冊表)),但它仍然不適用於http://127.0.0.1:9000

registry.addMapping("/**") 
      .allowedOrigins("http://127.0.0.1:9000") 
      .allowedMethods("POST", "OPTIONS", "GET", "DELETE", "PUT") 
      .allowedHeaders("X-Requested-With,Origin,Content-Type,Accept,Authorization") 
      .allowCredentials(true).maxAge(3600); 

配置基於:https://spring.io/guides/gs/rest-service-cors/

請點我正確的directon來解決這個問題。

+0

如果我理解正確,您嘗試從不同的ip 127.0.0.1訪問。 (你不在本地主機了)。但你只允許從本地主機訪問(127.0.0.1) –

+0

可能的重複[Spring CORS否'訪問控制 - 允許來源'頭部存在](http://stackoverflow.com/questions/35091524/spring-cors -no-access-control-allow-origin-header-is-present) –

+0

Periklis - 是的,我試圖從不同的IP訪問。我只允許從http:// localhost:8084 /訪問。 – Matt

回答

0

你可以嘗試這樣的事情

@Configuration 
public class CorsConfig { 
    @Bean 
    public WebMvcConfigurer corsConfigurer() { 
     return new WebMvcConfigurerAdapter() { 
      @Override 
      public void addCorsMappings(CorsRegistry registry) { 
      registry.addMapping("/**") 
        .allowedMethods(HttpMethod.OPTIONS.name(), 
          HttpMethod.PATCH.name(), 
          HttpMethod.PUT.name(), 
          HttpMethod.DELETE.name(), 
          HttpMethod.GET.name(), 
          HttpMethod.POST.name()) 
        .maxAge(360); 
      } 
     }; 
    } 
} 

注:Spring版本應該是4.2或更高版本

+0

不幸的是仍然沒有工作:( – Matt

+0

你可以嘗試添加:'.allowedHeaders(「header1」,「header2」)',接受發送到服務器的頭部變量。 – NguaCon

6

希望你找到了答案前不久,但是如果沒有(如果任何人發現這個問題,因爲我搜索):

問題是,春季安全使用過濾器和這些過濾器通常優先於用戶定義的過濾器,@CrossOrigin和類似的註釋離子等。

對我而言,有效的方法是將CORS過濾器定義爲具有最高優先級的bean,如建議here

@Configuration 
public class MyConfiguration { 

    @Bean 
    public FilterRegistrationBean corsFilter() { 
     UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 
     CorsConfiguration config = new CorsConfiguration(); 
     config.setAllowCredentials(true); 
     config.addAllowedOrigin("http://127.0.0.1:9000"); 
     config.setAllowedMethods(Arrays.asList("POST", "OPTIONS", "GET", "DELETE", "PUT")); 
     config.setAllowedHeaders(Arrays.asList("X-Requested-With", "Origin", "Content-Type", "Accept", "Authorization")); 
     source.registerCorsConfiguration("/**", config); 
     FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); 
     bean.setOrder(Ordered.HIGHEST_PRECEDENCE); 
     return bean; 
    } 
}