2016-10-23 15 views
1

我目前使用的是Auth0(和一个Angular 2 GUI),它在请求中向Spring Boot API发送"x-xsrf-token"类型的标头。如何在弹簧启动中更改允许的标头

我得到的错误:

"XMLHttpRequest cannot load http://localhost:3001/ping . Request header field x-xsrf-token is not allowed by Access-Control-Allow-Headers in preflight response."

这是很公平的访问控制响应报头的响应头的列表中不包括x-xsrf-token(调试在Chrome中的网络选项卡中的请求时) 。

我已经尝试了一些解决方案,我想我来最接近的是覆盖在AppConfig的配置方法,并加入我自己的CorsFilter,如下图所示:

(Imports removed for brevity) 

@Configuration 
@EnableWebSecurity(debug = true) 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
public class AppConfig extends Auth0SecurityConfig { 

    @Bean 
    public Auth0Client auth0Client() { 
     return new Auth0Client(clientId, issuer); 
    } 

    @Bean 
    public Filter corsFilter() { 
     UrlBasedCorsConfigurationSource source = new  UrlBasedCorsConfigurationSource(); 
     CorsConfiguration config = new CorsConfiguration(); 
     config.setAllowCredentials(true); 
     config.addAllowedOrigin("*"); 
     config.addAllowedHeader("Content-Type"); 
     config.addAllowedHeader("x-xsrf-token"); 
     config.addAllowedHeader("Authorization"); 
     config.addAllowedHeader("Access-Control-Allow-Headers"); 
     config.addAllowedHeader("Origin"); 
     config.addAllowedHeader("Accept"); 
     config.addAllowedHeader("X-Requested-With"); 
     config.addAllowedHeader("Access-Control-Request-Method"); 
     config.addAllowedHeader("Access-Control-Request-Headers"); 
     config.addAllowedMethod("OPTIONS"); 
     config.addAllowedMethod("GET"); 
     config.addAllowedMethod("PUT"); 
     config.addAllowedMethod("POST"); 
     config.addAllowedMethod("DELETE"); 
     source.registerCorsConfiguration("/**", config); 

     return new CorsFilter(source); 
    } 

    @Override 
    protected void authorizeRequests(final HttpSecurity http) throws Exception { 
     http.authorizeRequests().antMatchers("/ping").permitAll().antMatchers("/").permitAll().anyRequest() 
      .authenticated(); 
    } 

    String getAuthorityStrategy() { 
     return super.authorityStrategy; 
    } 

    @Override 
    protected void configure(final HttpSecurity http) throws Exception { 
     http.csrf().disable(); 
     http.addFilterAfter(auth0AuthenticationFilter(auth0AuthenticationEntryPoint()), 
      SecurityContextPersistenceFilter.class) 
      .addFilterBefore(simpleCORSFilter(), Auth0AuthenticationFilter.class); 
     authorizeRequests(http);http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); 

     http.cors(); 
     } 
    } 

不幸的是我有没有成功与此,仍然看到x-xsrf-token我的获取请求的响应标题中丢失。

我基地项目是这样的: https://github.com/auth0-samples/auth0-spring-security-api-sample/tree/master/01-Authentication/src/main

任何想法将受到欢迎。

回答

0

尝试,

@Bean 
    public FilterRegistrationBean corsFilter() { 
     UrlBasedCorsConfigurationSource source = new  UrlBasedCorsConfigurationSource(); 
     CorsConfiguration config = new CorsConfiguration(); 
     config.setAllowCredentials(true); 
     config.addAllowedOrigin("*"); 

     config.addAllowedHeader("*");  
     config.addAllowedMethod("*");   
     source.registerCorsConfiguration("/**", config); 



     FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); 
     bean.setOrder(0); 
     return bean; 


    } 

https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

+0

恐怕我对此没有任何运气。当我启动服务器时没有错误,但是当我开始运行GET请求时,我一直得到相同的“x-xsrf-token”投诉。无论如何感谢 –

+0

我试过这种配置,就像@JackWooding我发现它没有工作。然后,我试着明确地列出了我在'addAllowedHeader'部分使用的头文件,尽管文档声明“*”被接受为通配符,但它仍然可行。我认为在处理这些标题时存在某种潜在的bug,但我不太确定它在哪里。 – Jules

1

相信这是已经在你发布here但认为对SOF值得回答,因为你已经在这里提出的问题太问题的讨论。

你可以做什么,是修改AppConfig覆盖CORS过滤器从default library config用自己的更新CORS Filter implementation

我觉得你的情况设置,这可能只是附加X-XSRF令牌到这条线:

response.setHeader("Access-Control-Allow-Headers", "Authorization, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, " + 
       "Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"); 

然而,正如我在GitHub的问题(上面链接)所指出的,如果你给我你的HAR文件,我可以确认这是绝对的情况,并提供了一个可行的解决方案为您服务。

0

最终我自己解决了这个问题。我在pom.xml文件此处被拆除这种依赖性:

<dependency> 
      <groupId>com.auth0</groupId> 
      <artifactId>auth0-spring-security-api</artifactId> 
      <version>0.3.1</version> 
</dependency> 

,因为它是在github的一个开源项目,在这里https://github.com/auth0/auth0-spring-security-api。我在自己的包中添加了源代码到我的项目中,并将它的依赖项添加到我的pom.xml文件中。然后,我在Auth0CORSFilter改变doFilter方法,包括我的X-XSRF令牌:

@Override 
public void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain chain) throws IOException, ServletException { 
    final HttpServletResponse response = (HttpServletResponse) res; 
    response.setHeader("Access-Control-Allow-Origin", "*"); 
    response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE"); 
    response.setHeader("Access-Control-Max-Age", "3600"); 
    response.setHeader("Access-Control-Allow-Headers", "Authorization, x-xsrf-token, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, " + 
      "Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"); 
    chain.doFilter(req, res); 
} 

不幸的是,我现在不能那样容易,如果我需要切换的版本,我也有一个稍微混乱的代码库,但是因为我是Spring的新手,这比花费数小时尝试覆盖Auth0CORSFilter Bean容易得多,如果这是可能的话。