2016-08-13 2 views
2

Я пытаюсь создать страницу с угловым 2 поверх API загрузки Spring. Я настроил CORS (правильно я считаю), но меня блокирует защита CSRF от Spring Security.Угловые 2/Проблемы с безопасностью CSRF безопасности

Это мое понимание, что Angular 2 обрабатывает CSRF автоматически с RC2, и я на RC4. Сервер посылает маркер XSRF в ответ на POST от клиента, как показано здесь:

Я предполагаю, что Угловые 2 не поднять его? Я знаю, что CORS работает, потому что, когда я положил .ignoringAntMatchers («/ urlhere /») в конце .csrf() для проверки, запрос прошел, поэтому CORS не блокирует его. Вот мой метод конфигурации для HttpSecurity:

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http 
     .authorizeRequests() 
      .antMatchers("/auth/**", "/signup/**").permitAll() 
      .and() 
     .headers() 
      .and() 
     .exceptionHandling() 
      .and() 
     .cors() 
      .and() 
     .csrf() 
      .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); 

} 

Моего Логин процесс на стороне клиента состоит из метода, который первым отправляет учетные данные, а затем использует маркер JWT для получения учетных данных. Эти два метода заключаются в следующем:

sendCredentials(model) { 
    let tokenUrl = 'http://localhost:8080/user/login'; 
    let headers1 = new Headers({'Content-Type': 'application/json'}); 

    return this.http.post(tokenUrl, JSON.stringify(model), {headers: headers1}); 
} 

sendToken(token){ 
    let userUrl = 'http://localhost:8080/rest/user/users'; 
    let headers2 = new Headers({'Authorization': 'Bearer '+token}); 

    return this.http.get(userUrl, {headers:headers2}); 
} 

Что мне не хватает для удовлетворения требований к защите CSRF? Это клиентская сторона? Или мне нужно добавить /login/ в мой список antMatchers?

ответ

1

Я знаю, что поздно, но я столкнулся с одной проблемой и сумел ее решить. Проблемы в запросе угловой Http:

return this.http.post(tokenUrl, JSON.stringify(model), {headers: headers1}); 

Вам нужно настроить его для отправки так:

return this.http.post(tokenUrl, JSON.stringify(model), {headers: headers1, withCredentials: true}); 

Вы должны добавить withCredentials: true все ваши запросы HTTP. Зачем вам это нужно? Каждый раз, когда вы отправляете HTTP-запрос (OPTIONS, POST и т. Д.) На Spring (сервер), он генерирует новый XSRF-TOKEN и выдает его клиенту, withCredentials: true сохранит этот новый XSRF-TOKEN в браузере, а затем будет использоваться для нового HTTP-запроса, поэтому в случае, если один из ваших HTTP-запросов не имеет withCredentials: true, он просто проигнорирует новый XSRF-TOKEN и использует старый (expired) XSRF-TOKEN для HTTP-запроса.

+0

Спасибо за ответ! Он добавляет базу знаний, поэтому я отметил это как ответ. –

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