2017-02-03 2 views
1

Приложение Angular2 отправляет HTTP-запрос GET с X-AUTH-TOKEN значением заголовка в Spring Boot. Каждый раз, когда request.getHeader("X-AUTH-TOKEN") возвращает null.Конфигурация Spring Boot CORS не принимает заголовок авторизации

Интересно, что он отлично работает, если я отправлю запрос от клиента ARC или любого другого клиента отдыха.

Я также потратил много времени, убедившись, что запрос Angular HTTP GET отправляет токен JWT.

Угловой код

getCandidatesByUserId(userId: number): Observable<Candidate[]> { 
    let headers = new Headers({ 'X-AUTH-TOKEN': 'let-jwt-test-token-in' }); 
    console.log('Token is '+ headers.get('X-AUTH-TOKEN')); 
    return this.http.get(this.url+userId+'/candidates', { 
     headers: headers 
    }) 
     .map((response: Response) => <Candidate[]> response.json()) 
     .do(data => console.log('All: '+ JSON.stringify(data))) 
     .catch(this.handleError); 
    } 

JWTFilter

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

     try { 
      final HttpServletResponse response = (HttpServletResponse) res; 
      response.setHeader("Access-Control-Allow-Origin", "*"); 
      response.setHeader("Access-Control-Allow-Credentials", "true"); 
      response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE"); 
      response.setHeader("Access-Control-Max-Age", "3600"); 
      response.setHeader("Access-Control-Allow-Headers", "X-AUTH-TOKEN, Content-Type, Accept"); 
      response.setHeader("Access-Control-Expose-Headers", "X-AUTH-TOKEN, Content-Type"); 

      HttpServletRequest httpRequest = (HttpServletRequest) request; 
      Map<String, String> blackListedTokenMap = 
        (Map<String, String>) ((HttpServletRequest) request) 
          .getSession() 
          .getServletContext() 
          .getAttribute(WebAppListener.TOKEN_BLACK_LIST_MAP); 
      String authToken = authenticationService.getToken(httpRequest); 
      if (authToken != null && blackListedTokenMap.containsValue(authToken)) { 
       throw new RuntimeException("token invalidated"); 
      } 
      UserAuthentication authentication = (UserAuthentication) authenticationService.getAuthentication(httpRequest); 
      SecurityContextHolder.getContext().setAuthentication(authentication); 
      filterChain.doFilter(request, response); 
      SecurityContextHolder.getContext().setAuthentication(null); 
     } catch (RuntimeException e) { 
      ((HttpServletResponse) res).sendError(HttpServletResponse.SC_UNAUTHORIZED); 
     } 
    } 

SpringSecurityConfig

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

     http 
      .csrf() 
       .csrfTokenRepository(new HttpSessionCsrfTokenRepository()) 
       .requireCsrfProtectionMatcher(new AntPathRequestMatcher("*/*")); 
     http 
      .exceptionHandling() 
       .and() 
      .anonymous() 
       .and() 
      .servletApi() 
       .and() 
      .headers() 
       .cacheControl(); 

     http 
       //.addFilterBefore(corsFilter, ChannelProcessingFilter.class) 
      .authorizeRequests() 
       .antMatchers("/resources/**").permitAll()// allow for static resources 
       .antMatchers("/signup").permitAll() 
       .antMatchers("/forgot").permitAll() 
       .antMatchers("/login").permitAll() 
       .antMatchers("/reset").permitAll() 
       .antMatchers("/health").permitAll() 
       .antMatchers("/hello").permitAll() 
       .antMatchers("/").permitAll() 
       .antMatchers("/reset_pw").permitAll() 
       .anyRequest().authenticated() 
       .and() 
      .addFilterAfter(new JJWTFilter(tokenAuthenticationService), 
         UsernamePasswordAuthenticationFilter.class); 
    } 

консоли Журналы enter image description here

+1

Вы используете весенний ботинок? Недавно у меня была аналогичная проблема. Приложение сломалось, что принимал заголовок авторизации на фильтре. Это было null. Определено, что аннотация @EnableWebMvc закручивала его. –

+0

@ LucasHolt Да. Я использую 'SpringBoot' для бэкэнд, но не использую' @ EnableWebMvc' в любом месте. –

+0

Привет, любые новости по этому поводу? У меня с той же проблемой. Я могу звонить с почтальоном, но не из моего углового приложения. – Castelmager

ответ

0

Я решил с:

//Define class with this annotation 

@Configuration 

public class CorsConfig { 

    @Bean 
    public FilterRegistrationBean corsFilter() { 
     UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 
     CorsConfiguration config = new CorsConfiguration(); 
     config.setAllowCredentials(true); 
     config.addAllowedOrigin("*"); 
     config.addAllowedHeader("*"); 
     config.addAllowedMethod("OPTIONS"); 
     config.addAllowedMethod("HEAD"); 
     config.addAllowedMethod("GET"); 
     config.addAllowedMethod("PUT"); 
     config.addAllowedMethod("POST"); 
     config.addAllowedMethod("DELETE"); 
     config.addAllowedMethod("PATCH"); 
     source.registerCorsConfiguration("/**", config); 
     // return new CorsFilter(source); 
     final FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); 
     bean.setOrder(0); 
     return bean; 
    } 

    @Bean 
    public WebMvcConfigurer mvcConfigurer() { 
     return new WebMvcConfigurerAdapter() { 
      public void addCorsMappings(CorsRegistry registry) { 
       registry.addMapping("/**").allowedMethods("GET", "PUT", "POST", "GET", "OPTIONS"); 
      } 
     }; 
    } 
} 

Вы можете определить этот класс и добавить в загрузочном яровой класса @ComponentScan(basePackageClasses= CorsConfig.class)

Или просто использовать вышеупомянутый метод внутри класса загрузки.

Тогда должно работать.

Смежные вопросы