Deaktivieren Sie die Federsicherheit für die OPTIONS-HTTP-Methode


73

Ist es möglich, Spring Security für eine Art HTTP-Methode zu deaktivieren?

Wir haben eine Spring REST-Anwendung mit Diensten, für die ein Autorisierungstoken im Header der http-Anforderung angehängt werden muss. Ich schreibe einen JS-Client dafür und verwende JQuery, um die GET / POST-Anforderungen zu senden. Die Anwendung ist mit diesem Filtercode CORS-fähig.

doFilter(....) {

  HttpServletResponse httpResp = (HttpServletResponse) response;
  httpResp.setHeader("Access-Control-Allow-Origin", "*");
  httpResp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
  httpResp.setHeader("Access-Control-Max-Age", "3600");
  Enumeration<String> headersEnum = ((HttpServletRequest) request).getHeaders("Access-Control-Request-Headers");
  StringBuilder headers = new StringBuilder();
  String delim = "";
  while (headersEnum.hasMoreElements()) {
    headers.append(delim).append(headersEnum.nextElement());
    delim = ", ";
  }
  httpResp.setHeader("Access-Control-Allow-Headers", headers.toString());
}

Wenn JQuery jedoch die OPTIONS-Anforderung für CORS sendet, antwortet der Server mit dem Token Authorization Failed. Offensichtlich fehlt der OPTIONS-Anforderung das Autorisierungstoken. Ist es also möglich, die OPTIONEN aus der Spring-Sicherheitskonfiguration aus der Sicherheitsschicht zu entfernen?

Antworten:


10

Hast du das versucht?

Sie können mehrere Elemente verwenden, um unterschiedliche Zugriffsanforderungen für unterschiedliche URL-Sätze zu definieren. Diese werden jedoch in der angegebenen Reihenfolge ausgewertet und die erste Übereinstimmung wird verwendet. Sie müssen also die spezifischsten Übereinstimmungen an die Spitze setzen. Sie können auch ein Methodenattribut hinzufügen, um die Übereinstimmung auf eine bestimmte HTTP-Methode (GET, POST, PUT usw.) zu beschränken.

<http auto-config="true">
    <intercept-url pattern="/client/edit" access="isAuthenticated" method="GET" />
    <intercept-url pattern="/client/edit" access="hasRole('EDITOR')" method="POST" />
</http>

Oben bedeutet, dass Sie das URL-Muster auswählen müssen, das abgefangen werden soll, und welche Methoden Sie möchten


Aber ich denke, wir können so etwas nicht haben <intercept-url pattern="/client/edit" access="hasRole('EDITOR')" method="POST, OPTIONS" />. Richtig ?
Dhanush Gopinath


Wie würde dies im Fall von @ PreAuthorize-Annotation funktionieren? Ich möchte, dass Put-Methoden Administratorzugriff und Post-Methoden Benutzerzugriff haben
Dipanshu Verma

Was wird es in Java-Konfiguration äquivalent sein
Ravi Kumar

Bitte schauen Sie sich mein Problem an. stackoverflow.com/questions/50579277/…
dnvsp

137

Wenn Sie eine auf Anmerkungen basierende Sicherheitskonfigurationsdatei ( @EnableWebSecurity& @Configuration) verwenden, können Sie in der configure()Methode Folgendes ausführen, damit die OPTIONAnforderungen von Spring Security ohne Authentifizierung für einen bestimmten Pfad zugelassen werden:

@Override
protected void configure(HttpSecurity http) throws Exception
{
     http
    .csrf().disable()
    .authorizeRequests()
      .antMatchers(HttpMethod.OPTIONS,"/path/to/allow").permitAll()//allow CORS option calls
      .antMatchers("/resources/**").permitAll()
      .anyRequest().authenticated()
    .and()
    .formLogin()
    .and()
    .httpBasic();
}

3
+1 Genau das, was wir getan haben, um CORS OPTIONS-Anforderungen zu aktivieren.
Siebenschläfer

es funktioniert gut Vielen Dank für Ihre Tipps, die ich suche und viel debugge, aber jetzt nicht behoben werden kann. Ich habe es behoben, um diese Tipps zu verwenden
Saurav Wahid

Ich habe Ihre Antwort gefunden, als ich ein ähnliches Problem untersucht habe, das in der jetzigen Form noch nicht auf Ihre Lösung reagiert. Bist du bereit einen Blick darauf zu werfen? Hier ist der Link: stackoverflow.com/questions/36705874/…
CodeMed

Dies könnte für ein allgemeines Verständnis hilfreich sein
Dr4gon

Ich bin selbst kein Java Spring-Benutzer. Ich habe das gleiche Problem, wenn ich im Backend eine andere Sprache verwende. Bringt Java / Spring eine zusätzliche Sicherheitsabstraktion mit sich oder ist es größtenteils sicher, die Authentifizierungs-Middleware-Methode für alle OPTIONS-Anforderungen zu ignorieren?
Kunok

48

Alle OPTIONEN im Kontext zulassen:

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**");
    }

3
Dies schien die einzige Möglichkeit zu sein, OPTIONS-Anfragen ohne Autorisierung zuzulassen.
Jaseeey

Wenn Sie dann einen Optionsendpunkt erstellen, den Sie sichern möchten, vergessen Sie den Ausschluss in Ihrer Konfiguration und jeder kann darauf zugreifen. Sie sollten in Betracht ziehen, den Filter zu verwenden, um zu ermöglichen, dass Cors-Optionsanforderungen von der Frühlingssicherheit ausgeschlossen werden: docs.spring.io/spring-security/site/docs/4.2.x/reference/html/…
Tim

1
Mit HttpSecurity ist http.authorizeRequests () .antMatchers (HttpMethod.OPTIONS, "/ registrybrain / **"). PermitAll ()
Ena

Verbrachte mehr als 2 Stunden damit, eine Lösung zu finden - nur das funktionierte.
Waqas

1
"Wenn Sie dann einen Optionsendpunkt erstellen, den Sie sichern möchten" @Tim, warum sollte jemand das benötigen?
Maksim Gumerov

3

Für den Fall, dass jemand nach einer einfachen Lösung mit Spring Boot sucht. Fügen Sie einfach eine zusätzliche Bohne hinzu:

   @Bean
   public IgnoredRequestCustomizer optionsIgnoredRequestsCustomizer() {
      return configurer -> {
         List<RequestMatcher> matchers = new ArrayList<>();
         matchers.add(new AntPathRequestMatcher("/**", "OPTIONS"));
         configurer.requestMatchers(new OrRequestMatcher(matchers));
      };
   }

Bitte beachten Sie, dass dies je nach Ihrer Anwendung für potenzielle Exploits geöffnet werden kann.

Offenes Problem für eine bessere Lösung: https://github.com/spring-projects/spring-security/issues/4448


IgnoredRequestCustomizerist seit Spring Boot 2 veraltet.
bvdb

0

Wenn Sie eine auf Anmerkungen basierende Sicherheitskonfiguration verwenden, sollten Sie CorsFilterdem Anwendungskontext Federn hinzufügen, indem Sie .cors()Ihre Konfiguration aufrufen.

@Override
protected void configure(HttpSecurity http) throws Exception
{
     http
    .csrf().disable()
    .authorizeRequests()
      .antMatchers("/resources/**").permitAll()
      .anyRequest().authenticated()
    .and()
    .formLogin()
    .and()
    .httpBasic()
    .and()
    .cors();
}

-1

In einigen Fällen muss es hinzugefügt werden configuration.setAllowedHeaders(Arrays.asList("Content-Type"));, corsConfigurationSource()wenn WebSecurityConfigurerAdapterdas Cors-Problem gelöst werden soll.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.