禁用Spring Security标头不起作用

时间:2016-03-15 08:31:16

标签: java security caching spring-security spring-boot

我需要在Spring Security conf中禁用缓存控制头。

根据文档,一个简单的http.headers.disable()应该这样做,但我仍然看到

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

标题。

我当前的安全配置是:

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

到目前为止我尝试过的事情:

application.properties

我添加了security.headers.cache=false行,但没有区别。

使用过滤器

我尝试了以下过滤器:

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

添加日志记录后,我看到此过滤器只写入X-XSS-Protection标头,所有缓存标头稍后写入某处,此过滤器无法“覆盖”它们。即使我在安全过滤器链的最后位置添加此过滤器,也会发生这种情况。

使用拦截器

我尝试了以下拦截器:

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

这(很可预测)只添加了标题,这意味着除了拦截器添加的标题之外,原始的no-cache标题仍会出现。

我在这里结束了我的智慧。如何摆脱Spring安全性设置的缓存控制头?

6 个答案:

答案 0 :(得分:3)

可能有所帮助:

@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

答案 1 :(得分:1)

您需要一个使用两个重叠配置方法扩展WebSecurityConfigurerAdapter的类来配置过滤器和身份验证提供程序。例如,以下内容至少可以起作用:

e.g, NSLog("%@", modelObj.Name);

您还可以完全取消Spring Security的公共静态资源,如下所示(与上述相同的类):

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

}

这需要配置两个资源处理程序才能正确获取缓存控制标头:

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

答案 2 :(得分:1)

所以,我自己找到了答案: 我最终通过在名为spring.resources.cachePeriod的yml配置文件中创建一个新条目并将其设置为不同于0的值来使Cache-Control标头更改其值。不好的是,所有资源都使用此设置,因此根据资源情况,无法根据资源进行区分。

this question的答案帮助很大。

答案 3 :(得分:0)

所以我遇到了类似的问题,希望我的大多数REST端点都有标准的“不要缓存我”标题Spring正在注入,但在一个端点上我想插入自己的。

在您给予ResponseEntry的HttpHeaders对象中指定自己的对象不起作用。

什么工作是在HttpServletResponse上直接显式设置标题。

Spring正在设置“Cache-Control”,“Pragma”和“Expires”。以下演示了如何覆盖和设置1分钟缓存:

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

答案 4 :(得分:0)

在我的应用程序类中通过@EnableOAuth2Sso启用OpenId Connect后出现此问题。经过大约六个小时的调试和阅读文档后,发现@EnableOAuth2Sso必须放在WebSecurityConfigurerAdapter上,否则默认设置会覆盖自定义设置:

不可

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

<强>为

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

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

答案 5 :(得分:-2)

使用

是对的
http
    .headers().disable()
    ...

将停用您的标头。如果您只想禁用缓存控制,则可以使用以下命令:

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

我发布了a sample,证明了这一点与with a test一致。

我的猜测是你遇到的问题是你有多个HttpSecurity配置。请记住,如果你有:

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

只有以/myPath/开头的网址才会受到影响。此外,如果您有多个HttpSecurity个实例,则会按顺序考虑每个HttpSecurity实例,并且仅使用第一个HttpSecurity实例。例如,如果你有:

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

如果您请求/ myPath / admin / abc

首先考虑MyPathAdminWebSecurityConfig。由于/myPath/admin//myPath/admin/开头,我们将使用MyPathAdminWebSecurityConfig而不考虑任何其他配置。这意味着您将期望为此请求获取标头。