2016-03-15 17 views
15

Devo disattivare le intestazioni di controllo della cache nel mio conf.La disattivazione delle intestazioni Spring Security non funziona

Secondo la documentazione di un semplice http.headers.disable() dovrebbe farlo, ma io continuo a vedere le intestazioni

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

nelle risposte.

Il mio attuale configurazione di sicurezza è:

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

Le cose che ho provato finora:

application.properties

ho aggiunto la linea security.headers.cache=false, ma che non ha fatto differenza.

Usando un filtro

ho provato il seguente filtro:

@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); 
     } 
    }); 
} 

Dopo aver aggiunto la registrazione ho visto che questo filtro scrive solo il X-XSS-Protection intestazione, tutte le intestazioni di cache sono scritti da qualche parte più avanti e questo il filtro non ha accesso a "sostituiscile". Ciò accade anche se aggiungo questo filtro nell'ultima posizione della catena del filtro di sicurezza.

L'utilizzo di un intercettore

ho provato la seguente intercettore:

@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", ""); 
} 

Questo (piuttosto prevedibile) appena aggiunto le intestazioni, il che significa che l'originale no-cache intestazioni appaiono ancora in aggiunta a quelli aggiunti dall'intercettore.

Sono qui che il mio spirito finirà. Come faccio a eliminare l'intestazione del controllo della cache impostata dalla sicurezza Spring?

risposta

-2

Hai ragione che l'utilizzo

http 
    .headers().disable() 
    ... 

disabiliterà le intestazioni. Se si desidera solo di controllo della cache disabilitata, è possibile utilizzare il seguente:

http 
    .headers() 
     .cacheControl().disable() 
     .and() 
    ... 

ho postato a sample che illustra questo lavoro lungo with a test.

La mia ipotesi è che il problema è che si dispone di più configurazioni HttpSecurity. Ricordate che se si dispone di:

http 
    .antMatchers("/myPath/**") 
    ... 

Solo gli URL che iniziano con /myPath/ sarà influenzato. Inoltre, se si dispone di più istanze HttpSecurity, ciascuna istanza HttpSecurity viene considerata in ordine e viene utilizzata solo la prima istanza HttpSecurity.Per esempio, se si dispone di:

@Configuration 
@Order(1) 
public class MyPathAdminWebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .antMatchers("/myPath/admin/**") 
      .authorizeRequests() 
       .anyRequest().hasRole("ADMIN"); 
    } 
} 

@Configuration 
@Order(2) 
public class MyPathWebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .antMatchers("/myPath/**") 
      .headers() 
       .cacheControl().disable(); 
    } 
} 

@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
       .anyRequest().authenticated(); 
    } 
} 

Se si richiede/myPath/admin/abc

Prima MyPathAdminWebSecurityConfig è considerato. Dal /myPath/admin/ inizia con /myPath/admin/ useremo MyPathAdminWebSecurityConfig e non consideriamo alcuna altra configurazione. Ciò significa che ti aspetteresti di ottenere indietro le intestazioni per questa richiesta.

+0

L'assunzione è errata.Non ho più configurazioni di sicurezza per i percorsi secondari di una configurazione già esistente. Ho altre configurazioni di sicurezza per altri percorsi (non in alcun modo relativi a "/ mypath"), ma quelli non dovrebbero essere davvero una preoccupazione, non ho bisogno di disabilitare le intestazioni lì. – j0ntech

1

Avrete bisogno di una classe che estenda lo WebSecurityConfigurerAdapter con due metodi di configurazione sovrascritti per configurare il filtro e il provider di autenticazione. Ad esempio, i seguenti lavori a un minimo indispensabile:

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);   
    }  

} 

È inoltre possibile disabe Primavera di sicurezza completamente per le risorse statiche pubbliche come segue (nella stessa classe come sopra):

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

Questo richiede la configurazione due gestori di risorse per ottenere le intestazioni di controllo della cache destra:

@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); 
    } 
} 
+0

Non ha funzionato ... –

0

Così, ho trovato la risposta me stesso: ho finalmente fatto l'intestazione Cache-Control per cambiare il suo valore con la creazione di una nuova voce nel mio file di configurazione yml chiamato spring.resources.cachePeriod e impostarlo su un valore diverso di 0. La cosa brutta è che tutte le risorse usano questa impostazione, quindi non c'è modo di renderla diversa a seconda della risorsa, per quanto ne so.

La risposta a this question ha aiutato molto.

0

Quindi ho avuto un problema simile, volendo che la maggior parte dei miei endpoint REST avesse lo standard "non mi cache", le intestazioni di Spring si stanno iniettando, ma su un endpoint voglio inserire il mio.

Specificare il proprio nell'oggetto HttpHeaders che si consegna a ResponseEntry non funziona.

Cosa FUNZIONA è impostare esplicitamente le intestazioni DIRECTLY su HttpServletResponse.

La primavera sta impostando "Cache-Control", "Pragma" e "Expires". Di seguito viene illustrato come eseguire l'override e impostato per una cache di 1 minuto:

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

ho avuto questo problema dopo l'abilitazione OpenID Connect attraverso @EnableOAuth2Sso sulla mia classe di applicazione. Dopo circa sei ore di debug e lettura attraverso documenti, si è scoperto che @EnableOAuth2Sso devono essere immessi sul WebSecurityConfigurerAdapter o impostazioni personalizzate saranno sostituite da quelle predefinite:

Buone

// 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(); 
    } 
} 

Bad

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

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