如何在 Spring 引导中为 /favicon.ico 设置 Strict-Transport-Security Header

How To Set Strict-Transport-Security Header for /favicon.ico in Spring Boot

我的 Spring 引导应用程序(v1.4.2,带有 undertow 启动器)当前正在为其服务的每个资源设置 Strict-Transport-Security header,包括 API 资源来自我的 spring-web RestControllers,以及 /src/main/resources/static 中的静态资源。我发现的 只有 例外是 /favicon.ico。此文件中缺失的 header 触发了我们的安全扫描结果,我想清除它们。

这是我到目前为止尝试过的方法:

  1. 禁用 Spring 的 custom favicon handlingspring.mvc.favicon.enabled=false
  2. 为 HttpSecurity 配置中的所有资源添加了 explicit header handling

    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) {
            http.headers()
                .httpStrictTransportSecurity()
                .requestMatcher(request -> true);
        }
    }
    

似乎无论我做什么,此资源都会生成一组与 Spring Boot.例如,/favicon.ico.

中没有应用于我所有其他响应的缓存控制 header

有趣的是,我发现 header 我能够影响此文件的是 Content-Type header(默认行为 returns Content-Type: application/octet-stream) 通过将 MimeMapping 添加到 EmbeddedServletContainerCustomizer:

@Configuration
public class WebConfigurer implements EmbeddedServletContainerCustomizer {

    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT);
        mappings.add("ico", "image/x-icon");
        container.setMimeMappings(mappings);
    }
}

SpringBootWebSecurityConfiguration 有一个默认的忽略路径列表,这些路径被添加到 servlet 堆栈中的第一个安全过滤器之一:

private static List<String> DEFAULT_IGNORED = Arrays.asList(
    "/css/**", 
    "/js/**",
    "/images/**", 
    "/webjars/**", 
    "/**/favicon.ico");

您可以通过在 SecurityProperties bean 上设置 "ignored" 列表来覆盖此忽略路径列表。

@Bean
public SecurityProperties securityProperties() {
    SecurityProperties props = new SecurityProperties();
    props.setIgnored(Arrays.asList("none"));
    return props;
}

将 null 或空列表传递到 setIgnored() 会产生默认行为,因此我添加了关键字 "none" 以指示我不想忽略任何路径。 SpringBootWebSecurityConfiguration 在构建 "ignores" 过滤器之前从列表中删除 "none"。