2014-12-13 13 views
7

Sorun, Spring Security ve Angular arasında çalışan CSRF tokenlerini elde etmektir. Spring Security, 'X-CSRF-TOKEN' göndermek için nasıl yapılandırılır?

Spring Security CSRF Token Interceptor for Angular

işi yapmak gereken bir şey gibi görünüyor, ama hayır 'X-CSRF-TOKEN' sunucudan BAŞ yanıt yoktur.

Güncel küçük uygulamam GitHub (Tag v.1.0) adresinde bulunmaktadır ve konuyu bilen biri kodu hızlı bir şekilde görebilseydi çok da çok memnun olurum. Sorunun anlaşılması kolay olmalı.

belgelere dayanarak, CSRF otomatik olarak etkin olması gerekirdi izlenimi altında değilim, ama bu durum görünmemektedir.

Spring Boot'ı kullanıyorum ve bir şeyin farklı şekilde yapılandırılması gerekirse, ek açıklama tabanlı yapılandırmayı XML üzerinden tercih ediyorum.

Spring Security, Angular'a karşı iş yapmak için başka herhangi bir yaklaşım mı? "XSRF-TOKEN" İnanıyorum adında bir çerez, böylece müşteri için en kolay şey için

+0

Yaklaşan 4.0 sürümüne baktınız mı? CSRF koruması varsayılan olarak etkindir. – chrylis

+0

3.2 kullanıyorum ve varsayılan olarak da CSRF var. Ancak, sadece Interceptor'un CSRF'yi başlığa nasıl ayarlayacağını kod örnekleri ile açıklayan kapalı bir sorunu olduğunu fark ettim. Şimdi bunu incelemen gerekiyor ... – masa

cevap

6

Açısal görünümün onun göndermektir. Sen (https://github.com/spring-guides/tut-spring-security-and-angular-js/blob/master/single/src/main/java/demo/UiApplication.java#L65 örneğin) bir Filter örneğin bunu yapabilirsiniz:

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); 
      } 
     }; 
    } 

Güncelleme: çerez csrf depo kullanırsanız açısal için doğru çerez adı varsayılan olarak kullanılır 4.2 yay güvenliği beri (link hala En iyi kaynak), yani artık özel bir filtreye ihtiyaç yoktur. Örnek: Issue #1: Orijinal GitHub deposundaki gizli kimse yoktu olarak

@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

Bu durumun sizi KSS saldırılarına karşı nasıl koruduğunu pek anlamıyorum? Mekanizmanın tersi olmalı, daima bir çerez değeri ayarladınız ve geri döndüğünde, açısal ayarın gelen HTTP isteğinin Header ile aynı değeri ayarladığını doğrulamanız gerekir. –

+1

Evet ama Spring Security sizin için bu kadar uygun (bağlantıyı takip ettiniz mi?). Bu, Spring'teki mevcut CRSF filtresi için açısal kurallara bir adaptördür. Çalışıyor, bana güven. –

+1

Teşekkürler! Ancak, bu sefer Http başlıklarının yanıtı olduğu anlaşılıyor ... – masa

1

Ben soruyu kendime cevap veriyorum. Bu çözüm, CSRF parametrelerini Http mesaj başlıkları olarak ekleyen birkaç Java kodu satırı eklemekti.

Ben Etiketi v.2.0 ile GitHub'dan repo için bir çalışma çözüm ekledi.

+0

Her şeyden önce, bu modülü ekledikten sonra "Cross-Origin Request Blocked" hata mesajlarını (Google geocoding ile) almaya başladığımdan beri benim için çalışma çözümü değil. Sorun bildirildi. – masa

İlgili konular