wake-up-neo.com

Spring Security: Aktivieren/Deaktivieren der CSRF nach Client-Typ (Browser/Nicht-Browser)

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

18

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()

        }
     }
}
9

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.

5
Serge Ballesta

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.

1
Jelqui