无效的CSRF令牌 - Chrome浏览器中的错误

时间:2015-01-21 12:54:15

标签: spring spring-security

我正在使用Spring框架构建的Web应用程序。我收到Invalid CSRF Token错误。我只在Chrome浏览器中看到此行为。以下是以下步骤:

  1. 通过提供userName和密码
  2. 登录应用程序
  3. 点击退出按钮退出。用户将被重定向到登录页面
  4. 然后,在登录页面再次尝试登录。我收到以下错误
  5. Invalid CSRF Token 'd82dfa89-81b1-449e-9ef5-cdd32957e7f3' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.

    Spring安全配置:

    http.
         addFilter(headerAdminFilter).
         authorizeRequests().
         regexMatchers("/login.*").permitAll().
         regexMatchers("/api.*").fullyAuthenticated().
         regexMatchers("/jolokia.*").hasRole(ADMINISTRATOR).
         regexMatchers("/appadmin.*").hasRole(ADMINISTRATOR).
         regexMatchers(".*").fullyAuthenticated().
     and().
         formLogin().loginPage("/login").successHandler(new RedirectingAuthenticationSuccessHandler()).
     and().
          exceptionHandling().authenticationEntryPoint(new RestAwareAuthenticationEntryPoint("/login"));
    

    退出按钮的HTML代码:

    <a id="logout-button" ng-click="ac.logout()" href="/login">Log Out</a>
    

    用于退出功能的AngularJS代码:

    this.logout = function () {
        $http.post("/logout");
    }
    

1 个答案:

答案 0 :(得分:0)

以下javascript代码段修复过时的CSRF令牌。当用户尝试提交登录表单并在表单实际提交之前更新表单中的CSRF值时,我们的想法是获取一个新的令牌。

$(document).ready(function() {

    $("form[method=post]").submit(function(event) {
        var form = this;
        $.get("csrf-token", function(content) {
            $(form).find("input[name=_csrf]").val(content);
            form.submit();
        });
        event.preventDefault();
    });

});

您需要在服务器端使用/csrf-token映射来返回当前的CSRF令牌。