Angular 2 / Spring Security CSRF实现问题

时间:2016-08-13 04:00:00

标签: java angular spring-boot spring-security

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

我的理解是Angular 2 handles CSRF automatically从RC2开始,我在RC4上。服务器正在发送一个XSRF令牌以响应来自客户端的POST,如下所示:

enter image description here

我认为Angular 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 个答案:

答案 0 :(得分:2)

我知道现在已经很晚了,我遇到了同样的问题,并设法解决了这个问题。 角度http请求中的问题:

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

你需要调整它以发送:

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

您必须在所有http请求中添加withCredentials: true。 你为什么需要它?每次向Spring(服务器)发送http请求(OPTIONS,POST等)时,它都会生成新的XSRF-TOKEN并将其发送给客户端,withCredentials: true将在浏览器中保存这个新的XSRF-TOKEN,然后用于新的http请求,因此,如果您的一个http请求没有withCredentials: true,它将只是忽略新的XSRF-TOKEN并使用旧的(过期的)XSRF-TOKEN来获取​​http请求。