如何在单页面应用程序(弹簧安全性)中提供CSRF令牌?

时间:2015-01-07 16:44:31

标签: spring spring-security csrf single-page-application

当我尝试使用ajax加载部分页面时,我收到403错误

  

无效的CSRF令牌' null'在请求参数' _csrf'上找到或标题' X-CSRF-TOKEN'。

Spring Security FAQ告诉我们

  

如果HTTP POST返回HTTP 403 Forbidden,但适用于HTTP   GET那么这个问题很可能与CSRF有关。要么提供   CSRF令牌或禁用CSRF保护(不推荐)。

那么,怎么做呢?

function getPage(url) {
    $.ajax({
        type: 'POST',
        url: url,
        data: {_csrf: "??"},
        success: function (data) {
            loadPage(url, data);
        }
    });
}

2 个答案:

答案 0 :(得分:0)

您可以从存储在客户端的cookie中获取令牌。为此你必须使用像这样的cookie服务: https://www.npmjs.com/package/angular2-cookie

写一个这样的函数来获取令牌:

getCookie(){
    return this._cookieService.get("token-name");
}

最后将令牌添加到请求标头:

doSomething(token){
    var json = JSON.stringify({});
    var headers = new Headers();
    headers.append('Content-Type','application/json');
     headers.append('token-name', token);
    return this._http.post('http://localhost:8080/doSomething', json, {
        headers: headers
    }).map(res => res.text()
    );
}

这解决了我的问题

答案 1 :(得分:-2)

在这里找到我自己的问题的答案: http://spring.io/blog/2013/08/21/spring-security-3-2-0-rc1-highlights-csrf-protection/

this - to html

<meta name="_csrf" content="${_csrf.token}"/>
<meta name="_csrf_header" content="${_csrf.headerName}"/>

this - to js

$(function () {
    var token = $("meta[name='_csrf']").attr("content");
    var header = $("meta[name='_csrf_header']").attr("content");
    $(document).ajaxSend(function(e, xhr, options) {
        xhr.setRequestHeader(header, token);
    });
});