2015-05-28 12 views
5

Zastrzeżenie: Moje pytanie jest nieco podobny do this question i this question, ale próbowałem wszystkie odpowiedzi sugerowane w tych wątków i już spędził kilka dni zmaga się z tym problemem.Selektywne korzystanie z filtrem CSRF Wiosna Security

Wprowadzam Spring Security 3.2.6 w mojej istniejącej aplikacji (JSP, tylko serwlet) i używam konfiguracji Java. Moja aplikacja będzie używana zarówno przez przeglądarki, jak i klientów spoza przeglądarki. Chcę, aby wszystkie żądania przeglądarki dotyczące adresów URL (tj. /webpages/webVersion/ i /webpages/webVersion2/) były włączone w CSRF, a wszystkie inne żądania wyłączenia CSRF. Klienci spoza przeglądarki nigdy nie uzyskują dostępu do dwóch adresów URL, podczas gdy aplikacja przeglądarki może również uzyskiwać dostęp do wyłączonych adresów URL CSRF.

Próbowałem różnych opcji:

  1. Włącz Wiosna Zabezpieczenia tylko na wyżej wspomnianych adresów URL:

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
        http.authorizeRequests() 
         .antMatchers("/","/resources/****").permitAll() 
         .antMatchers("/webpages/webVersion/****", "/webpages/webVersion2/****").authenticated() 
         .antMatchers("/webpages/****").permitAll() 
         .anyRequest().anonymous() 
         .and() 
         .formLogin().loginPage("/webpages/webVersion/login/newLogin.jsp").failureUrl("/webpages/webVersion/login/newLogin.jsp?error=true").loginProcessingUrl("/j_spring_security_check") 
         .usernameParameter("username").passwordParameter("password").defaultSuccessUrl("/webpages/webVersion/login/loginSuccess.jsp", true).permitAll() 
         .and() 
         .logout().logoutUrl("/webpages/webVersion/logout.jsp").permitAll() 
         .and().exceptionHandling().accessDeniedPage("/webpages/webVersion/404-error-page.jsp") 
         .and() 
         .csrf(); 
    } 
    

    To nie działa tak jak obserwujemy, że CSRF jest włączona dla wszystkich adresy URL.

  2. spróbował wykorzystać CSRFProtectionMatcher:

    .csrf().requireCsrfProtectionMatcher(csrfRequestMatcher); 
    

    CSRF jest włączona tylko przeznaczonych adresów URL, ale nawet /resources/** i /webpages/** adresy muszą być sprawdzane wewnątrz funkcji mecze. Wydaje się być trochę, biorąc pod uwagę, że będzie to dla wszystkich wniosków.

  3. wypróbowane przy użyciu innej wersji sposobu configure:

    @Override 
    public void configure(WebSecurity web) throws Exception { 
        web.ignoring().regexMatchers(".*?/jsp/(?!webVersion|webVersion2).*?"); 
    } 
    

    Nie jestem pewien, czy zrobiłem to poprawnie, ale nie przyniosły rezultatów chciałem.


Które z powyższego podejścia jest poprawna (wiosna zabezpieczeń) sposób robić to, co chcę? Jak mogę osiągnąć pożądane zachowanie z mojej konfiguracji Spring Security?

Odpowiedz

1

Okazało się, że ich był jakiś błąd z mojej konfiguracji i wreszcie osiągnąć cel za pomocą podejścia 3 .. Użyłem poniżej wersji funkcji configure wraz ze zwykłymi configure(HttpSecurity http) funkcji ..

@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring().regexMatchers(".*?/jsp/(?!webVersion|webVersion2).*?"); 
} 
Powiązane problemy