2014-12-13 7 views
7

Проблема заключается в том, чтобы использовать токены CSRF между Spring Security и Angular.Как настроить Spring Security для отправки «X-CSRF-TOKEN»?

Spring Security CSRF Token Interceptor for AngularSpring Security CSRF Token Interceptor for Angular похоже на то, что должно выполнять эту работу, но в ответе HEAD от сервера нет «X-CSRF-TOKEN».

Моя текущая крошечная реализация доступна в GitHub (тег v.1.0), и я был бы признателен, если кто-то, кто знает эту тему, быстро просмотрит код, проблема должна быть легко выявлена.

На основании документации у меня создается впечатление, что CSRF должен быть включен автоматически, но это, похоже, не так.

Я использую Spring Boot и предпочитаю настройку на основе аннотаций по XML, если что-то нужно настроить по-другому.

Любые другие подходы к обеспечению безопасности весны против Углового?

+0

Вы просмотрели предстоящий выпуск 4.0? По умолчанию включена защита CSRF. – chrylis

+0

Я использую 3.2, и по умолчанию имеет CSRF. Тем не менее, я только заметил, что у Interceptor есть закрытая проблема, которая объясняет с помощью примеров кода, как установить CSRF в заголовок. Нужно изучить, что сейчас ... – masa

ответ

6

Угловое выражение для печенья под названием «XSRF-TOKEN» Я верю, поэтому проще всего сделать это для клиента - отправить его. Вы можете сделать это в Filter, например, (например, из https://github.com/spring-guides/tut-spring-security-and-angular-js/blob/master/single/src/main/java/demo/UiApplication.java#L65):

private Filter csrfHeaderFilter() { 
     return new OncePerRequestFilter() { 
      @Override 
      protected void doFilterInternal(HttpServletRequest request, 
        HttpServletResponse response, FilterChain filterChain) 
        throws ServletException, IOException { 
       CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class 
         .getName()); 
       if (csrf != null) { 
        Cookie cookie = new Cookie("XSRF-TOKEN", csrf.getToken()); 
        cookie.setPath("/"); 
        response.addCookie(cookie); 
       } 
       filterChain.doFilter(request, response); 
      } 
     }; 
    } 

Update: с весной безопасности 4.2 правильное названием печенья для углового используются по умолчанию, если вы используете хранилище куков CSRF (ссылка еще лучший источник), т.е. больше нет необходимости в настраиваемом фильтре. Пример:

@Configuration 
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       ... 
       .and() 
      .csrf() 
       .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); 
+0

Я не понимаю, как это защитит вас от атаки CSRF? Механизм должен быть противоположным, вы всегда устанавливаете значение cookie, а когда оно возвращается, вы должны убедиться, что угловое значение имеет то же значение, что и заголовок входящего HTTP-запроса. –

+1

Да, но Spring Security делает это для вас (вы перешли по ссылке?). Это просто адаптер для существующего фильтра CRSF весной для угловых соглашений. Это работает, поверьте мне. –

+1

Спасибо! Однако на этот раз кажется, что заголовки Http являются ответом ... – masa

1

Я, отвечая на вопрос, как сам был скрыт один в исходном хранилище GitHub: Issue #1.

Решение состоит в том, чтобы добавить пару строк кода Java, который добавляет параметры CSRF в качестве заголовков сообщений Http.

Я добавил рабочее решение для GitHub repo с тегом v.2.0.

+0

Не работающее решение для меня в конце концов, поскольку я начал получать сообщения об ошибках с перекрестным запросом (с геокодированием Google) после добавления этого модуля. Сообщалось о проблеме. – masa

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