2015-01-21 11 views
0

Я работаю над веб-приложением, созданным с использованием Spring Framework. Я получаю ошибку Invalid CSRF Token. Я вижу это поведение только в браузере Chrome. Ниже Выполняемые:Недопустимый токен CSRF - ошибка в браузере Chrome

  1. Войти в приложение, обеспечивая имя пользователя и пароль
  2. Нажмите на кнопку Выход, чтобы выйти из системы. Пользователь будет перенаправлен на страницу входа в систему
  3. Затем на странице входа снова попробуйте войти в систему. Я получаю ошибку ниже

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"); 
} 
+0

Проблема заключается в том, что при повторном входе в систему страница входа в форму использует тот же токен csrf, который был создан ранее, вместо создания нового токена. Старый токен становится недействительным, когда вы выполнили выход из системы. –

+0

Я проверил токен 'csrf' до и после выхода из системы. Они разные. Только странная вещь, которую я наблюдал, до отображения страницы входа в систему, перенаправляется на другой URL-адрес, а затем отображает страницу входа. Не уверен, что это вызывает проблему. – Mithun

ответ

0

Следующие Java-фрагмент фиксирует несвежий маркер 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.

Смежные вопросы