春季4和CSRF

时间:2015-10-07 01:10:18

标签: spring spring-security spring-boot spring-restcontroller

我在单页应用程序中使用弹簧启动,弹簧支撑和弹簧安全性。

使用弹簧4,默认情况下启用CSRF。

我写了一个扩展WebSecurityConfigureAdapter

的类
    protected void configure(HttpSecurity http) throws Exception {
      http.authorizeRequests().antMatchers("/rest/**").authenticated();

      http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint);
      http.formLogin().successHandler(authenticationSuccessHandler);
      http.formLogin().failureHandler(authenticationFailureHandler);
      http.logout().logoutSuccessUrl("/");

    // tried with and without... same issue
      http.addFilterAfter(new CsrfTokenResponseHeaderBindingFilter(), CsrfFilter.class);

}

CsrfTokenResponseHeaderBindingFilter来自 https://github.com/aditzel/spring-security-csrf-filter/blob/master/src/main/java/com/allanditzel/springframework/security/web/csrf/CsrfTokenResponseHeaderBindingFilter.java

我只使用html(所以没有jsp,没有xhmtl ...)页面。 我做ajax调用并提供我的HTML。

请求标题

POST /login HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 30
Pragma: no-cache
Cache-Control: no-cache
Accept: */*
Origin: http://localhost:8080
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost:8080/
Accept-Encoding: gzip, deflate
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: JSESSIONID=B05ED2676EC1637D74AC7622E018C9FD

以我的形式

 <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

当我尝试登录时,我得到了

{"timestamp":1444179957867,"status":403,"error":"Forbidden","message":"Expected CSRF token not found. Has your session expired?","path":"/login"}

当日志失败时,此命令返回null

jqXHR.getResponseHeader('X-CSRF-TOKEN')

ajax call

var data = 'username=' + $('#username').val() + '&password=' +  $('#password').val();
  $.ajax({
    data: data,
    timeout: 1000,
    type: 'POST',
    url: '/login'
  }).done(function (data, textStatus, jqXHR) {
     window.location = "main.html";
  }).fail(function (jqXHR, textStatus, errorThrown) {
  });
});

修改

在我连接到localhost时的浏览器中:8080。

我在标题答案中看到

X-CSRF-HEADER:X-CSRF-TOKEN
X-CSRF-PARAM:_csrf
X-CSRF-TOKEN:0d5bf042-a30f-4f2e-a99c-51ed512f811a

如何在JS中获取此信息?我需要把它放在我的电话会议中。

1 个答案:

答案 0 :(得分:0)

没有足够的信息来调试此问题。您应该发布以下信息:

  1. 您的XML / Java Spring安全配置。
  2. 您的Spring Web配置。您使用的是JSP还是XHTML?您确定您的视图模型是否正确?也许你的网络模块没有发送令牌的问题。
  3. 实际的http请求标头/正文。请求实际上是正确的还是春天只是没有拿起令牌?