Spring Doc sagt
"Wenn Sie den CSRF-Schutz verwenden? Wir empfehlen, den CSRF-Schutz für alle Anforderungen zu verwenden, die von einem Browser von normalen Benutzern verarbeitet werden könnten. Wenn Sie nur einen Dienst erstellen, der von Nicht-Browser-Clients verwendet wird, möchten Sie wahrscheinlich deaktivieren CSRF-Schutz. "
Was kann ich tun, wenn mein Dienst sowohl von "Browser" - als auch von "Nicht-Browser" -Clients wie z. B. externen Diensten von Drittanbietern verwendet wird. Kann Spring Security die csrf-Komponente ausschließlich für bestimmte Clienttypen deaktivieren?
Referenz: http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html
Ich bin mir sicher, dass dies in Spring Security XML möglich ist. Da ich jedoch Java Config verwende, ist hier meine Lösung.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Configuration
@Order(1)
public static class SoapApiConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/soap/**")
.csrf().disable()
.httpBasic();
}
}
@Configuration
public static class WebApiConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginProcessingUrl("/authentication")
.usernameParameter("j_username")
.passwordParameter("j_password").permitAll()
.and()
.csrf().disable()
}
}
}
IMHO gibt es nichts dergleichen out of the Box. Was ich in Ihrem Fall tun würde, ist, eine URL-Hierarchie zu haben, die zum Beispiel bei /api
verwurzelt ist und von csrf ausgenommen wäre. Es ist einfach zu konfigurieren. In der XML-Konfiguration haben Sie einen normalen <http>
-Block einschließlich <csrf/>
. Sie duplizieren ihn einfach und modifizieren den ersten Block so
<http pattern="/api/**">
...
<!-- csrf -->
</http>
Wie es ist, wird es für jede Anforderung zur /api
-Hierarchie ausgelöst, ohne csrf zu verwenden, und alle anderen Anforderungen werden es verwenden.
Im normalen Teil der Anwendung verwenden Sie niemals die URL /api/**
und reservieren diese für andere Zwecke als die des Browsers.
Dann ordnen Sie sie in Ihren Controllern ihrer normalen URL und einer Kopie unter /api
zu:
@Controller
@RequestMapping({ "/rootcontrollerurl", "/api/rootcontrollerurl"})
class XController {
@RequestMapping(value = "/request_part_url", ...)
public ModelAndView method() {
...
}
}
(Natürlich können rootcontrollerurl
und request_part_url
leer sein ...)
Sie muss jedoch die Sicherheitsauswirkungen des Zulassens nicht csrf-gesteuerter Anforderungen analysieren und schließlich Controller aus der /api
-Hierarchie ausschließen.
Folgendes habe ich verwendet, um den CSRF-Schutz für einen bestimmten Endpunkt zu deaktivieren Fügen Sie in Ihrer appconfig-security.xml einen Knoten mit den Informationen Ihres Musters hinzu, wie im folgenden Beispiel:
<http security="none" pattern="/sku/*"/>
<http security="none" pattern="/sku/*/*"/>
<http security="none" pattern="/sku"/>
Denken Sie daran, dass die Reihenfolge wichtig ist, wenn Sie map all request mit dem Symbol '*' zuerst verwenden.