2015-05-03 94 views
1

我正在构建一个使用spring security和thymeleaf的web应用程序,我使用它登录和注销,但是当我尝试注册为最终用户时遇到了一些问题。我收到一个无效的csrf标记错误。我对此很陌生,我可以使用一些帮助。我的问题是我如何将一个令牌附加到该请求?(Post/registration)顺便说一句,我没有使用任何XML,我使用注释。403禁止无效的CSRF

这是请求

$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"} 
+0

您是否尝试使用浏览器或某种自动化的客户端的连接?如果是自动化客户端,那么如果您分享了一些客户端请求代码,将会有所帮助。 – merlin2011

+0

使用浏览器。 – SavvasM

回答

0

响应消息告诉你错误的服务器预计您的POST请求包括无论是“_csfr”参数或“X -CSRF-TOKEN“标题。据推测,您的服务器启用了CSFR保护。这是Spring Security的默认行为,尽管您可以禁用它。 (我不建议这样做。)

Spring Security文档的Cross Site Request Forgery (CSRF)章节解释了这一切。 This section解释了如何实现CSRF令牌,包括如何将令牌嵌入HTML <form>或将其包含在AJAX请求中的示例。

+0

感谢您的评论斯蒂芬,但您提供的链接空白。如果你可以仔细检查和更新,那将是惊人的。 – SavvasM

+0

我改变了链接。请再试一次。 –

+0

非常感谢您的帮助。 – SavvasM

0

您应该在请求中添加csrf参数作为参数。例如,使用下面的代码在表单中定义的输入来获得CSRF令牌,并添加作为请求参数的形式发送POST请求:

<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令牌发送在您的请求中的参数。

<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> 

更多的,请参阅以下链接:弹簧安全性,你可以通过下面的配置定义CSRF参数名 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