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?

Dhanush Gopinath
quelle

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

Koitoer
quelle
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();
}
Felby
quelle
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, "/**");
    }
Luc S.
quelle
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

Dennis Kieselhorst
quelle
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();
}
Meysam
quelle
-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.

FabianoLothor
quelle