2016-12-10 5 views
2

Ich versuche, CORS in einer Spring-Boot-Anwendung zu konfigurieren, die bereits grundlegende Auth eingerichtet hat.Wie konfiguriert man CORS und Basic Authorization im Spring Boot?

Ich habe an vielen Stellen gesucht, einschließlich this answer, die auf Filter based CORS support in der offiziellen Dokumentation verweist.

Bis jetzt kein Glück.

Meine AJAX-Anfrage ist auf diese Weise erfolgt. Es funktioniert, wenn vom selben Ursprung http://localhost:8080 getan wird.

fetch('http://localhost:8080/api/lists', { 
    headers: { 
    'Authorization': 'Basic dXNlckB0ZXN0LmNvbToxMjM0NQ==' 
    } 
} 

Das ist AJAX-Anforderung von einem App Reagieren auf http://localhost:3000 getan, also habe ich versucht, den folgenden Frühling Boot CORS config:

@Configuration 
class MyConfiguration { 

    @Bean 
    public FilterRegistrationBean corsFilter() 
    { 
     UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 

     CorsConfiguration config = new CorsConfiguration(); 
     config.setAllowedOrigins(Arrays.asList("http://localhost:3000")); 
     // Maybe I can just say "*" for methods and headers 
     // I just copied these lists from another Dropwizard project 
     config.setAllowedMethods(Arrays.asList("GET", "PUT", "POST", "DELETE", "OPTIONS", "HEAD")); 
     config.setAllowedHeaders(Arrays.asList("X-Requested-With", "Origin", "Content-Type", "Accept", 
      "Authorization", "Access-Control-Allow-Credentials", "Access-Control-Allow-Headers", "Access-Control-Allow-Methods", 
      "Access-Control-Allow-Origin", "Access-Control-Expose-Headers", "Access-Control-Max-Age", 
      "Access-Control-Request-Headers", "Access-Control-Request-Method", "Age", "Allow", "Alternates", 
      "Content-Range", "Content-Disposition", "Content-Description")); 
     config.setAllowCredentials(true); 

     source.registerCorsConfiguration("/**", config); 
     FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); 
     bean.setOrder(0); 
     return bean; 
    } 
} 

Mein WebSecurityConfig:

@Configuration 
class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 

     http.httpBasic().and() 
      .authorizeRequests() 
      .antMatchers("/", "/index.html").permitAll() 
      .anyRequest().fullyAuthenticated(); 
    } 
} 

Der fetch Anruf von http://localhost:3000 zeigt diesen 401-Fehler in der Konsole an:

Abruf-API kann nicht geladen werden http://localhost:8080/api/lists. Antwort für Preflight hat ungültige HTTP-Statuscode 401.

enter image description here

Ein im Netzwerk Registerkarte Chrom dev Werkzeuge, die ich dieses OPTIONS Anfrage siehe:

enter image description here

Antwort

3

Ich denke, Sie müssen Erlauben Sie OPTION Anfragen in Ihre Web Security Config. Etwas wie:

.antMatchers(HttpMethod.OPTIONS, "/your-url").permitAll()

+0

Danke! Du hattest Recht! Für den Moment, nur um zu sehen, dass es funktioniert, habe ich '.antMatchers (HttpMethod.OPTIONS,"/** "). PermitAll()'. Es funktioniert mit meiner 'FilterRegistrationBean'. Vielleicht funktioniert es auch mit dem 'CorsFilter', aber das Problem war, dass der OPTIONS-Anruf blockiert wurde. –

0

Versuchen Sie folgendes:

@Configuration 
public class CorsConfig { 

    @Bean 
    public CorsFilter corsFilter() { 

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 
    CorsConfiguration config = new CorsConfiguration(); 
    config.setAllowCredentials(false); //updated to false 
    config.addAllowedOrigin("*"); 
    config.addAllowedHeader("*"); 
    config.addAllowedMethod("GET"); 
    config.addAllowedMethod("PUT"); 
    config.addAllowedMethod("POST"); 
    source.registerCorsConfiguration("/**", config); 
    return new CorsFilter(source); 
    } 

    @Bean 
    public WebMvcConfigurer corsConfigurer() { 
    return new WebMvcConfigurerAdapter() { 
     @Override 
     public void addCorsMappings(CorsRegistry registry) { 
     registry.addMapping("/").allowedOrigins("http://localhost:3000"); 
     } 
    }; 
    } 

} 
+0

Danke aber dasselbe Ergebnis ... Außerdem habe ich meine Config Einstellung zu Ihrer Lösung, aber es ändert sich nichts. Ich benutze nicht Spring MVC, aber ich habe Ihren 'WebMvcConfigurer' auch nur für den Fall aufgenommen. –

+0

Verwenden Sie Boot mit Angular 2 – Drew1208

+0

Warum fragen Sie? Ich benutze React jetzt, um es zu versuchen, aber ich plane, auch Angular 2 zu versuchen. Jedenfalls rufe ich den '@ RestController' mit der Funktion' fetch' auf. Ich meine, dass keine React-Komponenten an dem Aufruf beteiligt sind. –

Verwandte Themen