2016-11-01 13 views
9

wszyscy. Jestem nowy w Angular 2 i Spring Framework. Próbuję proste żądanie pobierania z nagłówkiem autoryzacji (podstawowy autoryzacja).Odpowiedź dla preflight ma nieprawidłowy kod stanu HTTP 401 - Wiosna

Używam Spring Boot (1.2.6.RELEASE), co również może mieć znaczenie. Moja konfiguracja CORS wygląda następująco.

@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() { 
} 

} 

A oto jak to wygląda od strony klienta

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

ciśgle:

XMLHttpRequest nie może załadować http://localhost:8080/api/login?username=user. Odpowiedź na prefligtu ma nieprawidłowy kod stanu HTTP 401

Proszę o pomoc, nie wiem co mi brakuje ... Sprawdziłem wokół dużo już stanowisk, ale nie mógł się tam dostać ...

+0

HTTP 401 oznacza, że ​​wniosek nie może być spełnione z powodu braku zezwolenia, sprawdź czy działa –

+0

Czy możesz usunąć response.setHeader ("Access-Control-Allow-Credentials", "true"); i wypróbować? –

+0

@TharsanSivakumar, ale to samo pomogło, dziękuję i tak –

Odpowiedz

7

unikać filtrowanie i ustawić stan 200, gdy jest metoda http OPCJE

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

Dzięki @Eswar, już nie otrzymuję błędu. Czy ignorowanie OPCJI wymaga dobrej implementacji? Pytam, bo naprawdę nie wiem. –

+0

możemy sprawdzić nagłówki żądań i wysłać kod stanu bez filtra. przeglądarka wysyła żądanie preflight za każdym razem, gdy wysyłamy autoryzację w nagłówku, dlatego właśnie sprawdzamy pochodzenie i kod statusu błędu.ignorowanie opcji nie będzie miało wpływu na inne metody http, ponieważ filtrujemy, ale nie jestem pewien, czy jest to dobra implementacja czy nie. – Eswar

3

Jeśli jest ktoś wsiada do podobnej sytuacji roboczej wokół z wiosennym Boot, Spring Bezpieczeństwa i klientów, takich jak kątowy 2/4, mam opublikował wyniki here.

Dla tych, którzy szukają na krótką odpowiedź, trzeba skonfigurować dwie rzeczy:

  1. ze sprężyną Boot, zalecany sposób, aby umożliwić globalne CORS jest zadeklarować w terminie wiosennym MVC i połączony z porządku- drobnoziarnisty konfiguracja @CrossOrigin jak:

    @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. Następnie, pracując z wiosennym Security, należy włączyć CORS na poziomie Wiosna Bezpieczeństwa, a także aby mogła ona wykorzystać konfigurację zdefiniowane na poziomie Wiosna MVC jako:

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

Cheers !!!

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ opinia/niskiej jakości-posts/17426158) – khelwood

+0

@khelwood zaktualizował odpowiedź, ale dlaczego w dół głosowanie? czy to coś w rodzaju osądzania książki po okładce? gdybym nie zaktualizował odpowiedzi, byłbym wdzięczny. –

+0

Nie przesłałem. – khelwood

0

Inną opcją jak na wiosnę przewodnika bezpieczeństwa:

w klasie bezpieczeństwa config, który rozciąga WebSecurityConfigurerAdapter skonfigurować 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); 





}