2015-05-28 23 views
5

Haftungsausschluss: Meine Frage ist ähnlich wie this question und this question, aber ich habe alle Antworten in diesen Threads vorgeschlagen und bereits verbrachte einige Tage mit dem Problem zu kämpfen.Selektive Verwendung von CSRF-Filter von Spring Security

Ich führe Spring Security 3.2.6 in meiner bestehenden Anwendung (JSP, nur Servlet) ein und verwende Java-Konfiguration. Meine Anwendung wird sowohl von Browsern als auch von Clients ohne Browser verwendet. Ich möchte, dass alle Browseranforderungen an URLs (d. H. /webpages/webVersion/ und /webpages/webVersion2/) CSRF-aktiviert sind und alle anderen Anforderungen CSRF deaktiviert sind. Nicht-Browser-Clients greifen niemals über zwei URLs zu, während die Browseranwendung auch auf CSRF-deaktivierte URLs zugreifen kann.

Ich habe eine Vielzahl von Optionen versucht:

  1. Spring Security Aktivieren Sie nur auf den aformentioned URLs:

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

    Das hat nicht funktioniert, wie ich beobachten, dass CSRF für alle aktiviert ist die URLs.

  2. Versuchte CSRFProtectionMatcher mit:

    .csrf().requireCsrfProtectionMatcher(csrfRequestMatcher); 
    

    CSRF ist nur für den beabsichtigten URLs aktiviert, aber auch /resources/** und /webpages/** URLs müssen innerhalb Funktion passt überprüft werden. Scheint ein bisschen viel zu sein, wenn man bedenkt, dass es für alle Anfragen sein wird.

  3. Versucht eine andere Version des configure Methode:

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

    Ich bin nicht sicher, ob ich es richtig gemacht, aber diese produzieren nicht die Ergebnisse Ich wollte.


Welche der obigen Ansatz ist die korrekte (Spring Security) Art und Weise zu tun, was ich will? Wie kann ich das gewünschte Verhalten von meiner Spring Security-Konfiguration erreichen?

Antwort

1

Es stellte sich heraus, dass ihr einige Fehler mit meiner Konfiguration war und schließlich erreichte ich das Ziel Ansatz 3 .. ich unten Version der configure Funktion zusammen mit den üblichen configure(HttpSecurity http) Funktion ..

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