2015-06-10 3 views
0

Я пытаюсь реализовать угловое приложение с помощью этого учебника: https://spring.io/guides/tutorials/spring-security-and-angular-js/Spring Security отрицает выход из системы CSRF токена

Logging в работах и ​​выполнение последующего HTTP требует работы, тоже. Угловая успешно добавляет токен CSRF, и Spring успешно разбирает его. Предполагая, что маркер foo, запросы будут содержать эти заголовки:

Cookie: JSESSIONID=...; XSRF-TOKEN=foo

X-XSRF-ЗНАК: foo

Теперь, при попытке войти с $http.post('logout', {}), Угловые будут использовать точно такие же заголовки. Однако Spring отвечает с помощью 403:

Недопустимый токен CSRF «null» был найден в параметре запроса «_csrf» или в заголовке «X-CSRF-TOKEN».

Это то, что моя конфигурация безопасности выглядит следующим образом:

protected void configure(HttpSecurity http) throws Exception { 
    http 
     .httpBasic().and() 
     .authorizeRequests() 
     .antMatchers("/").permitAll() 
     .anyRequest().authenticated().and() 
     .logout().and() 
     .addFilterBefore(new CsrfHeaderFilter(), CsrfFilter.class); 
} 

CsrfHeaderFilter класс explained in the tutorial (который, видимо, работает на любой другой запрос).

ответ

0

Я понимаю, что это на 2 месяца позже, но я следил за тем же самым руководством сегодня, и этот пост без ответа продолжает появляться, поэтому вот решение.

В принципе, вам не удалось сконфигурировать конфигурацию csrfTokenRepository() в конфигураторе HttpSecurity.

Spring CsrfTokenRepository ожидает заголовок "X-CSRF-TOKEN" но Угловые посылает маркер в заголовке под названием "X-XSRF-TOKEN" так the guide рекомендует вам установку Экземпляр CsrfTokenRepository, который ожидает Угловой заголовка по умолчанию "X-XSRF-TOKEN":

protected void configure(HttpSecurity http) throws Exception { 
    http 
     .httpBasic().and() 
     .authorizeRequests() 
     .antMatchers("/").permitAll() 
     .anyRequest().authenticated().and() 
     .logout() 
     .and() 
     //This is the first part you were missing 
     .csrf() 
      .csrfTokenRepository(csrfTokenRepository()) 
     .and() 
      .addFilterBefore(new CsrfHeaderFilter(), CsrfFilter.class); 
} 


@Bean 
public CsrfTokenRepository csrfTokenRepository(){ 
    HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); 

    // This is the second part you were missing 
    repository.setHeaderName("X-XSRF-TOKEN"); 
    return repository; 
} 
Смежные вопросы