2015-05-03 93 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