You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Security的FilterChain外禁用frameOptions(如用WebSecurityCustomizer)

解决方案

首先明确:WebSecurityCustomizer不适用此场景,它的核心作用是配置无需安全拦截的请求路径,无法修改Headers这类具体安全规则。

推荐使用Spring Security WebFlux官方提供的ServerHttpSecurityCustomizer扩展接口,无需修改内部库代码,也不用重写整个SecurityFilterChain Bean,就能在单个项目中局部禁用frameOptions。

最优实现代码

在目标项目中添加如下Bean定义:

@Bean
public ServerHttpSecurityCustomizer frameOptionsDisablingCustomizer() {
    return http -> http.headers(headers -> 
        headers.frameOptions(frameOptions -> frameOptions.disable())
    );
}

原理

ServerHttpSecurityCustomizer是Spring Security的标准扩展点,所有实现该接口的Bean会被自动注入到ServerHttpSecurity的构建流程中。内部库定义的SecurityFilterChain在初始化时,会自动应用这个自定义配置,在原有规则基础上覆盖frameOptions的设置,完全满足单个项目的定制需求,且不影响其他依赖内部库的项目。

兼容低版本的备选方案

如果你的Spring Security版本低于5.4(ServerHttpSecurityCustomizer在5.4版本引入),可以通过BeanPostProcessor修改已初始化的SecurityWebFilterChain:

@Component
public class FrameOptionsDisabler implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof SecurityWebFilterChain) {
            SecurityWebFilterChain originalChain = (SecurityWebFilterChain) bean;
            // 基于原有FilterChain的配置,重新构建并修改frameOptions
            ServerHttpSecurity http = ServerHttpSecurity.builder();
            originalChain.getWebFilters().forEach(http::addFilterAt);
            http.headers(headers -> headers.frameOptions(frameOptions -> frameOptions.disable()));
            return http.build();
        }
        return bean;
    }
}

注意事项

  • 使用BeanPostProcessor时,需确保该类的初始化顺序晚于内部库的SecurityWebFilterChain Bean,避免修改失效。
  • 优先选择ServerHttpSecurityCustomizer方案,它是官方推荐的扩展方式,代码更简洁且维护性更强。

内容的提问来源于stack exchange,提问作者asgarov1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 19:07:26