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:
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.
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.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?