2016-08-13 109 views
2

我正在尝试在Spring Boot API上构建一个Angular 2页面。我已经配置了CORS(正确的我相信),但是我被Spring Security的CSRF保护阻止了。Angular 2/Spring Security CSRF实现问题

这是我的理解,Angular2自动处理RC2的RCF,我在RC4上。服务器响应来自客户端的POST发送XSRF令牌在这里看到:

我认为角2不捡起来?我知道CORS正在工作,因为当我在.csrf()的末尾放.ignoringAntMatchers(“/ urlhere /”)进行测试时,请求已经完成,因此CORS不会阻止它。这里是我的HttpSecurity配置方法:

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

    http 
     .authorizeRequests() 
      .antMatchers("/auth/**", "/signup/**").permitAll() 
      .and() 
     .headers() 
      .and() 
     .exceptionHandling() 
      .and() 
     .cors() 
      .and() 
     .csrf() 
      .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); 

} 

我的登录信息在客户端过程包括,首先发送证书的方法,然后使用JWT令牌来获取证书。两种方法如下:

sendCredentials(model) { 
    let tokenUrl = 'http://localhost:8080/user/login'; 
    let headers1 = new Headers({'Content-Type': 'application/json'}); 

    return this.http.post(tokenUrl, JSON.stringify(model), {headers: headers1}); 
} 

sendToken(token){ 
    let userUrl = 'http://localhost:8080/rest/user/users'; 
    let headers2 = new Headers({'Authorization': 'Bearer '+token}); 

    return this.http.get(userUrl, {headers:headers2}); 
} 

我缺少什么来满足CSRF保护的要求?它是客户端吗?或者我需要将/login/添加到我的antMatchers列表中?

回答

1

我知道这是晚了,但是,我遇到了同样的问题,并设法解决它。 问题的角度http请求:

return this.http.post(tokenUrl, JSON.stringify(model), {headers: headers1}); 

您需要调整它来发送这样的:

return this.http.post(tokenUrl, JSON.stringify(model), {headers: headers1, withCredentials: true}); 

您必须添加withCredentials: true到您的所有HTTP请求。 为什么你需要它?每次向Spring(服务器)发送http请求(OPTIONS,POST等)时,它都会生成新的XSRF-TOKEN并将其发送给客户端,withCredentials: true将在浏览器中保存这个新的XSRF-TOKEN,之后用于新的http请求,所以如果您的某个http请求没有withCredentials: true,它将简单地忽略新的XSRF-TOKEN,并对http请求使用旧的(过期的)XSRF-TOKEN。

+0

感谢您的回答!它增加了知识库,所以我将其标记为已回答。 –