如何重写spring安全默认缓存,仅用于activator/info?

5us2dqdw  于 2021-06-29  发布在  Java
关注(0)|答案(0)|浏览(262)

我的rest应用程序使用以下securityconfig.configure方法配置了spring boot和springsecurity:

@Override
protected void configure(final HttpSecurity http) throws Exception {
   http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests()
      .requestMatchers(PUBLIC_URLS).permitAll()
      .requestMatchers(ACTUATOR_URLS).hasRole("ADMIN")
      .requestMatchers(PROTECTED_URLS).hasRole("ADMIN")
      .and()
      .cors().disable()
      .csrf().disable()
      .addFilterBefore(signaAuthenticationFilter, BasicAuthenticationFilter.class);
}

默认情况下,生成的响应标头将包括以下缓存控制标头:
[缓存控制:无缓存,无存储,最大年龄=0,必须重新验证]
根据此链接:https://www.baeldung.com/spring-security-cache-control-headers 我知道,对于这样一个请求,可以覆盖这种默认行为:

@GetMapping("/users/{name}") public ResponseEntity<UserDto> getUser(@PathVariable String name) { return ResponseEntity.ok() .cacheControl(CacheControl.maxAge(60, TimeUnit.SECONDS)) .body(new UserDto(name)); }

问题:我想用“cache control:max age=86400”设置一个响应头
仅用于执行器/信息请求。这个请求嵌入了spring引导执行器,我不能修改代码,必须更改securityconfig.configure()方法。但我尝试的每一个改变都会导致一些不良的副作用。我在前面的代码中尝试了以下加载项:

http.requestMatcher(new AntPathRequestMatcher(ACTUATOR_INFO)).headers().cacheControl().disable()
.addHeaderWriter(new StaticHeadersWriter(HttpHeaders.CACHE_CONTROL, "max-age=60"));
.and()
.requestMatcher(new NegatedRequestMatcher(new AntPathRequestMatcher(ACTUATOR_INFO))).headers().cacheControl();

这个 addHeaderWriter 不足以更改默认缓存控件,因此我需要添加 cacheControl().disable() 对于我要在缓存中保留数据的url(actuator/info)。但通常这会禁用所有uri的缓存。所以我需要加上 NegatedRequestMatcher . 但这会导致执行器/信息的缓存失效。
还有:我还丢失了其他一些默认的安全头,比如:x-frame-options:deny或x-xss-protection:1;模式=块
那么,我如何保留实际的securityconfig.configure()方法(默认无缓存)等,并允许发送带有“cache control:max age=86400”的响应头,以便让浏览器客户端在其缓存中保留…/actuator/info?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题