我正在使用spring security和thymeleaf构建一个Web应用程序,我使用登录和注销工作,但是当我尝试注册为最终用户时,我遇到了一些问题。我收到无效的csrf令牌错误。我是新手,我可以使用一些帮助。我的问题是如何将令牌附加到该请求?(发布/注册)顺便说一下,我没有使用任何XML,我使用注释。
这是请求
$scope.registerUser = function() {
$http.post(BASE_URL + "/registration", $scope.registrationRequest).
success(function (data, status, headers, config) {
$log.info("Success: " + headers('Location'));
$scope.hasRegistered = true;
}).error(function(data, status, headers, config) {
$scope.hasRegisterErrors = true;
$log.info("Error: status =" + status + ", body =" + JSON.stringify(data));
});
}
而错误
Error: status =403, body ={"timestamp":1430645356572,"status":403,"error":"Forbidden","message":"Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.","path":"/registration"}
响应消息告诉您服务器希望您的POST请求包含“_csfr”参数或“X-CSRF-TOKEN”标头。据推测,您的服务器已启用CSFR保护。这是Spring Security的默认行为,但您可以禁用它。 (我不建议这样做。)
Spring Security文档中的Cross Site Request Forgery (CSRF)章节解释了这一切的全部内容。 This section解释了如何实现CSRF令牌,包括如何将令牌嵌入HTML <form>
或将其包含在AJAX请求中的示例。
您应该在请求中添加csrf参数作为参数。例如,使用以下代码在表单中定义输入以获取csrf标记并添加为请求参数以通过表单发送发布请求:
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
或使用以下代码作为ajax调用发送:
<meta name="_csrf" content="${_csrf.token}"/>
<meta name="_csrf_header" content="${_csrf.headerName}"/>
然后构造标题:
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);
});
因此,您需要获取srcf令牌作为请求中的参数发送。通过spring security,您可以通过以下配置定义csrf参数名称:
<http>
<!-- ... -->
<csrf token-repository-ref="tokenRepository"/>
</http>
<bean id="tokenRepository"
class="org.springframework.security.web.csrf.CookieCsrfTokenRepository"
p:cookieHttpOnly="false">
<property name="sessionAttributeName" value="_csrf"/>
<property name="headerName" value="_csrf_header"/>
</bean>
更多信息,请参阅以下链接:https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html https://spring.io/blog/2013/08/21/spring-security-3-2-0-rc1-highlights-csrf-protection/ http://www.baeldung.com/spring-security-csrf