2

Я использую весенний ботинок, пружинный ремень и пружинную защиту в одностраничном приложении.весна 4 и CSRF

С пружиной 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"} 

Когда журнал не получится, эта команда возврата нулевой

jqXHR.getResponseHeader('X-CSRF-TOKEN') 
44 +44516410617451515053691368888

Аякса вызов

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) { 
    }); 
}); 

EDIT

В браузере когда я подключить к локальной машине: 8080.

я вижу в заголовке ответа

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

Как получить эту информацию в JS? Мне нужно поместить его в мой почтовый звонок.

+0

показать нам запрос HTTP-запроса –

+1

Вы не отправляете параметр csrf в сообщение –

+0

, что я предполагаю поставить там? –

ответ

0

Недостаточно информации для отладки этой проблемы. Вы должны направить следующую информацию:

  1. Конфигурация безопасности Spring/Java Spring.
  2. Конфигурация вашей весенней сети. Вы используете JSP или XHTML? Вы уверены, что ваша модель обзора верна? Возможно, у вас проблемы с веб-модулем, не отправляющим токен.
  3. Фактические заголовки/тела запроса HTTP. Действительно ли запрос действительно правильный или весна просто не поднимает токен?
Смежные вопросы