wake-up-neo.net

Das Deaktivieren von Spring Security-Headern funktioniert nicht

Ich muss die Cache-Steuerelement-Header in meiner Spring Security-Konfiguration deaktivieren.

Laut Dokumentation sollte es eine einfache http.headers.disable() machen, aber ich sehe immer noch die

Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Expires:0
Pragma:no-cache

Überschriften in Antworten.

Meine aktuelle Sicherheitskonfiguration ist:

http.antMatcher("/myPath/**") // "myPath" is of course not the real path
    .headers().disable()
    .authorizeRequests()
     // ... abbreviated
    .anyRequest().authenticated();

Dinge, die ich bisher versucht habe:

application.properties

Ich habe die Zeile security.headers.cache=false hinzugefügt, aber das hat keinen Unterschied gemacht.

Mit einem Filter

Ich habe folgenden Filter ausprobiert:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response) {
      @Override
      public void setHeader(String name, String value) {
        if (name.equalsIgnoreCase("Cache-Control")) {
          value = "";
        } else if (name.equalsIgnoreCase("Expires")) {
          value = "";
        } else if (name.equalsIgnoreCase("Pragma")) {
          value = "";
        }
        super.setHeader(name, value);
      }
  });
}

Nach dem Hinzufügen der Protokollierung habe ich festgestellt, dass dieser Filter nur den X-XSS-Protection -Header schreibt. Alle Cache-Header werden irgendwann später geschrieben und dieser Filter kann sie nicht "überschreiben". Dies geschieht auch, wenn ich diesen Filter an der letzten Position der Sicherheitsfilterkette hinzufüge.

Mit einem Abfangjäger

Ich habe den folgenden Interceptor ausprobiert:

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    String requestUri = request.getRequestURI();
    response.setHeader("Cache-Control", "max-age=3600");
    response.setHeader("Expires", "3600");
    response.setHeader("Pragma", "");
}

Dies fügte (ziemlich vorhersehbar) nur die Header hinzu, was bedeutet, dass die ursprünglichen no-cache-Header weiterhin zusätzlich zu den vom Interceptor hinzugefügten erscheinen.

Ich bin mit meinem Latein am Ende. Wie kann ich den von Spring Security festgelegten Cache-Steuerelement-Header entfernen?

16
j0ntech

Es kann helfen:

@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    // ...
    .headers()
        .defaultsDisabled()
        .cacheControl();
}
}

http://docs.spring.io/spring-security/site/docs/current/reference/html/headers.html#headers-cache-control

3
Colin Shah

Sie benötigen eine Klasse, die WebSecurityConfigurerAdapter um zwei überlagerte Konfigurationsmethoden erweitert, um den Filter und den Authentifizierungsanbieter zu konfigurieren. Zum Beispiel funktioniert Folgendes mindestens:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;

@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfigDemo extends WebSecurityConfigurerAdapter {

    @Autowired
    private DemoAuthenticationProvider demoAuthenticationProvider;

    @Override
    protected void configure(HttpSecurity http) throws Exception {        

    // Prevent the HTTP response header of "Pragma: no-cache".
    http.headers().cacheControl().disable();

    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {        
        auth.authenticationProvider(demoAuthenticationProvider);        
    }    

}

Sie können Spring Security auch für öffentliche statische Ressourcen wie folgt vollständig deaktivieren (in derselben Klasse wie oben):

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

Hierfür müssen zwei Ressourcenhandler konfiguriert werden, damit die Header der Cache-Steuerung richtig angezeigt werden:

@Configuration
public class MvcConfigurer extends WebMvcConfigurerAdapter
        implements EmbeddedServletContainerCustomizer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // Resources without Spring Security. No cache control response headers.
        registry.addResourceHandler("/static/public/**")
            .addResourceLocations("classpath:/static/public/");

        // Resources controlled by Spring Security, which
        // adds "Cache-Control: must-revalidate".
        registry.addResourceHandler("/static/**")
            .addResourceLocations("classpath:/static/")
            .setCachePeriod(3600*24);
    }
}
1
SkyWalker

Also fand ich die Antwort selbst: Endlich habe ich den Cache-Control-Header veranlasst, seinen Wert zu ändern, indem ich in meiner yml-Konfigurationsdatei einen neuen Eintrag mit dem Namen spring.resources.cachePeriod erstellt und ihn auf einen anderen Wert als 0 festgelegt habe. Das Schlimme ist, dass alle Ressourcen diese Einstellung verwenden, so dass es meines Wissens nach keine Möglichkeit gibt, sie je nach Ressource zu ändern.

Die Antwort auf diese Frage hat sehr geholfen.

1
Pedro Madrid

Ich hatte also ein ähnliches Problem: Ich wollte, dass die meisten meiner REST Endpunkte die standardmäßigen Header "Cache me" haben, die Spring einfügt, aber auf einem Endpunkt möchte ich meine eigenen einfügen.

Das Angeben Ihrer eigenen in dem HttpHeaders-Objekt, das Sie dem ResponseEntry geben, funktioniert nicht.

Was funktioniert, ist das explizite Setzen der Header DIREKT in der HttpServletResponse.

Spring setzt "Cache-Control", "Pragma" und "Expires". Im Folgenden wird gezeigt, wie ein 1-minütiges Caching überschrieben und festgelegt wird:

response.setHeader("Cache-Control", "max-age=60");
response.setHeader("Pragma", "");
HttpHeaders headers = new HttpHeaders();
headers.setExpires(System.currentTimeMillis()+60000);
return new ResponseEntity<>(body, headers, HttpStatus.OK);
0
BrianT.

Ich hatte dieses Problem, nachdem ich OpenId Connect über @EnableOAuth2Sso in meiner Anwendungsklasse aktiviert hatte. Nach ungefähr sechs Stunden Debuggen und Lesen von Dokumenten stellte sich heraus, dass @EnableOAuth2Sso auf WebSecurityConfigurerAdapter platziert werden MUSS oder benutzerdefinierte Einstellungen durch Standardeinstellungen überschrieben werden:

Gut

// In Application.Java
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

//In WebSecurity.Java
@Configuration
@EnableOAuth2Sso  // <- This MUST be here, not above
public class WebSecurity extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.headers().disable();
    }
}

Schlecht

// In Application.Java
@SpringBootApplication
@EnableOAuth2Sso  // <- Will overwrite config below
public class Application {
    //...
}

@Configuration
public class WebSecurity extends WebSecurityConfigurerAdapter {
    //...
}
0
ikh