2016-11-01 3 views
9

alle. Ich bin neu in Angular 2 und Spring Framework. Ich versuche eine einfache Get-Anfrage mit einem Autorisierungsheader (Basic Auth).Antwort für Preflight hat ungültigen HTTP-Statuscode 401 - Spring

Ich benutze Spring Boot (1.2.6.RELEASE), die auch relevant sein können. Meine CORS-Konfiguration sieht so aus.

@Component 
public class SimpleCorsFilter implements Filter { 

private final Logger log = LoggerFactory.getLogger(SimpleCorsFilter.class); 

public SimpleCorsFilter() { 
    log.info("SimpleCORSFilter init"); 
} 

@Override 
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) res; 

    response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); 
    response.setHeader("Access-Control-Allow-Credentials", "true"); 
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT"); 
    response.setHeader("Access-Control-Max-Age", "3600"); 
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me, authorization, x-auth-token"); 

    chain.doFilter(req, res); 
} 

@Override 
public void init(FilterConfig filterConfig) { 
} 

@Override 
public void destroy() { 
} 

} 

Und hier ist, wie es von der Client-Seite

this.headers.append('Authorization', 'Basic dXNlcjphZG1pbg=='); 
    return this.http 
      .get(`http://localhost:8080/api/login?username=${username}`, {headers : this.headers}) 
      .map(response => response.json().data as any); 
} 

Ich bekomme immer wieder sieht:

XMLHttpRequest kann nicht geladen werden http://localhost:8080/api/login?username=user. Antwort für Preflight hat ungültige HTTP-Statuscode 401

Bitte helfen Sie, ich weiß nicht, was ich bin fehlt ... ich um eine Menge von Stellen bereits überprüft, konnte aber nicht dorthin gelangen ...

+0

HTTP 401 bedeutet, dass Ihre Anfrage Genehmigung wegen fehlender nicht erfüllt werden kann konfigurieren erstreckt, überprüfen, ob funktioniert –

+0

Können Sie den response.setHeader entfernen ("Access-Control-Allow-Credentials", "true"); und ausprobieren? –

+0

@TharsanSivakumar, bekam das gleiche denken, danke trotzdem –

Antwort

7

vermeiden Filterung und Status-200, wenn http Methode OPTIONS

if("OPTIONS".equalsIgnoreCase(request.getMethod())) { 
    response.setStatus(HttpServletResponse.SC_OK); 
} else { 
    chain.doFilter(req, res); 
} 
+0

Dank @Eswar, ich bekomme den Fehler nicht mehr. Allerdings ignoriert die OPTIONS-Anfrage eine gute Implementierung? Ich frage, weil ich es wirklich nicht weiß. –

+0

können wir Anfrage Header validieren und Statuscode ohne Filter senden. Der Browser macht eine Preflight-Anfrage, wenn wir die Autorisierung in der Kopfzeile senden, also validieren wir nur den Ursprung und werfen den Fehlerstatuscode.Das Ignorieren von OPTIONS wird andere HTTP-Methoden nicht beeinflussen, da wir filtern, aber ich bin mir nicht sicher, ob es eine gute Implementierung ist oder nicht. – Eswar

3

Wenn es jemanden gibt, in die ähnliche Situation immer arbeiten, um mit Frühlings-Stiefel, Spring Security und Kunden wie Winkel 2/4, ich habe veröffentlichte die Ergebnisse here.

Für diejenigen, die für eine kurze Antwort suchen, müssen Sie zwei Dinge konfigurieren:

  1. mit Frühlings-Stiefel, der empfohlene Weg, globalen CORS ist zu ermöglichen, mit fein- zu erklären, innerhalb Spring MVC und kombiniert @CrossOrigin körnige Konfiguration wie:

    @Configuration 
    public class CorsConfig { 
    
        @Bean 
        public WebMvcConfigurer corsConfigurer() { 
         return new WebMvcConfigurerAdapter() { 
          @Override 
          public void addCorsMappings(CorsRegistry registry) { 
           registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins("*") 
             .allowedHeaders("*"); 
          } 
         }; 
        } 
    } 
    
  2. Dann, während mit Spring Security arbeitet, müssen Sie CORS bei Spring Sicherheitsstufe ermöglichen auch, damit ihnen die Konfiguration in Spring MVC-Ebene definiert nutzen, wie:

    @EnableWebSecurity 
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    
        @Override 
        protected void configure(HttpSecurity http) throws Exception { 
         http.cors().and()... 
        } 
    } 
    

Prost !!!

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/17426158) – khelwood

+0

@khelwood hat die Antwort aktualisiert, aber warum down voting ?? ist das etwas wie ein Buch nach dem Cover zu beurteilen? Wenn ich die Antwort nicht aktualisiert hätte, würde ich mich freuen. –

+0

Ich habe nicht downvote. – khelwood

0

Eine andere Option als im Frühjahr Sicherheitsleitfaden:

in Config-Class-Sicherheit, die WebSecurityConfigurerAdapter cors()

protected void configure(HttpSecurity http) throws Exception { 

       http 
         .cors().and().**this will use corsConfigurationSource by** default. 


    so lets define corsConfigurationSource 

    // other criteria 
    } 

**so lets define corsConfigurationSource** 

@Bean CorsConfigurationSource corsConfigurationSource() { 

CorsConfiguration configuration = new CorsConfiguration(); 

configuration.setAllowedOrigins(Arrays.asList("http://myufrontend.com")); 

configuration.setAllowedMethods(Arrays.asList("GET", "POST")); 

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 

source.registerCorsConfiguration("/**", configuration); 





} 
Verwandte Themen