Я использую весенний ботинок, пружинный ремень и пружинную защиту в одностраничном приложении.весна 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? Мне нужно поместить его в мой почтовый звонок.
показать нам запрос HTTP-запроса –
Вы не отправляете параметр csrf в сообщение –
, что я предполагаю поставить там? –