2016-07-07 25 views
2

Ich verwende Federsicherheit mit OAuth2 (Version: 4.0.4.RELEASE) und Feder (Version: 4.3.1.RELEASE).Spring Security CORS Filter funktioniert nicht

Ich entwickle Frontend in Angular und ich benutze grunt connect: dev (http://127.0.0.1:9000). Wenn ich versuche, mich mit localhost-Adresse anzumelden, funktioniert alles in Ordnung, aber von anderen bekomme ich Fehler:

"XMLHttpRequest kann nicht laden http://localhost:8084/oauth/token?client_id=MY_CLIENT_ID. Antwort auf Preflight-Anfrage nicht übergeben Kontrolle der Zugangskontrolle: Nein" Access-Control-Allow- Der Origin-Header ist auf der angeforderten Ressource vorhanden. Der Ursprung 'http://127.0.0.1:9000' ist daher nicht zulässig. Die Antwort hatte den HTTP-Statuscode 401. "

Ich habe das Mapping konfiguriert (überschreiben public void addCorsMappings (CorsRegistry Registrierung)) in WebMvcConfigurerAdapter (wie unten), aber es funktioniert immer noch nicht für 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); 

Konfiguration basiert auf: https://spring.io/guides/gs/rest-service-cors/

Bitte zeigen Sie mir das Recht directon dieses Problem zu beheben.

+0

Wenn ich richtig verstehe, versuchen Sie, von einer anderen IP 127.0.0.1 zuzugreifen. (Sie sind nicht mehr in localhost). Aber Sie haben nur Zugriff auf localhost (127.0.0.1). –

+0

Mögliches Duplikat von [Spring CORS Nein 'Access-Control-Allow-Origin' Header ist vorhanden] (http://stackoverflow.com/questions/35091524/spring-cors -no-access-control-allow-origin-header-is-present) –

+0

Periklis - ja ich versuche von verschiedenen IP zuzugreifen. Ich habe nur Zugriff von http: // localhost: 8084 /. – Matt

Antwort

0

Sie können versuchen, etwas wie die

@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); 
      } 
     }; 
    } 
} 

Hinweis: Feder Version 4.2 sein sollte oder später

+0

Leider immer noch nicht funktioniert :( – Matt

+0

können Sie versuchen, hinzuzufügen: '.allowedHeaders (" header1 "," header2 ")', akzeptieren Header-Variablen an den Server gesendet. – NguaCon

6

Hoffentlich finden Sie eine Antwort vor langer Zeit, aber wenn nicht (und wenn jemand anderes findet Diese Frage Suche wie ich war):

Das Problem ist, dass Spring Security arbeitet mit Filtern und diese Filter haben in der Regel Vorrang vor benutzerdefinierten Filter, @CrossOrigin und ähnliche Annotat Ionen usw.

Was für mich funktionierte, war, den CORS-Filter als eine Bohne mit höchster Priorität zu definieren, wie es here vorgeschlagen wurde.

@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; 
    } 
} 
Verwandte Themen