如何使用spring java config将X-Frame-Options响应头设置为允许来自值?

时间:2015-10-01 21:13:31

标签: spring-security http-headers spring-java-config x-frame-options

如何使用spring java config设置值为allow-from的X-Frame-Options响应头?

http.headers().disable()
    .addHeaderWriter(new XFrameOptionsHeaderWriter(
      new WhiteListedAllowFromStrategy(
        Arrays.asList("https://example1.com", "https://example2.com"))));

在Http Response标题中,我得到:

  

X-Frame-Options:“ALLOW-FROM DENY”。

为什么我的原点不在标题值中列出?

6 个答案:

答案 0 :(得分:4)

我最终静态地添加我的标题如下:

http
    .headers().frameOptions().disable()
    .addHeaderWriter(new StaticHeadersWriter("X-FRAME-OPTIONS", "ALLOW-FROM example1.com"));

答案 1 :(得分:0)

我一直在找同样的,但没有找到答案。无论我如何配置它,标题总是不正确的。

我的解决方法是使用Spring框架doc

中的委托头编写器

由于我构建了一个逻辑,总是设置SAMEORIGIN,不包括一些白名单:

new DelegatingRequestMatcherHeaderWriter(
            new NegatedRequestMatcher(
                    new OrRequestMatcher(
                            whiteLists
                    )
            ),
            new XFrameOptionsHeaderWriter(XFrameOptionsMode.SAMEORIGIN);

背后的逻辑:如果白名单中有任何匹配则不添加标题,否则添加标题为SAMEORIGIN值。

我认为值得考虑,因为AFAIK并非所有浏览器都支持ALLOW-FROM。

答案 2 :(得分:0)

//disable 默认策略。 这一句不能省。 
http.headers().frameOptions().disable();
//新增新的策略。 
http.headers().addHeaderWriter(new XFrameOptionsHeaderWriter(
            new WhiteListedAllowFromStrategy(
                    Arrays.asList("http://itaobops.aliexpress.com", 
"https://cpp.alibaba-inc.com",
                            "https://pre-cpp.alibaba-inc.com"))));

答案 3 :(得分:0)

这是在Spring Boot 2.3中对我有用的安全配置代码片段:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .headers()
            .frameOptions()
            .disable()
            .addHeaderWriter(new XFrameOptionsHeaderWriter(new StaticAllowFromStrategy(URI.create("example.com"))))
...

答案 4 :(得分:0)

您可以按如下所示允许多个URL,但是我不知道这是否是正确的方法,仍然可以正常工作。

public void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity.csrf().disable().authorizeRequests().anyRequest().permitAll()
                .and()
                .headers().defaultsDisabled()
                .and()
                .cors()
                .and()
                .headers()
                .cacheControl()
                .and()
                .contentTypeOptions()
                .and()
                .httpStrictTransportSecurity().disable()
                .and()
                .headers()
                .frameOptions().disable()
                .addHeaderWriter(new StaticHeadersWriter("X-FRAME-OPTIONS",
                    "ALLOW-FROM example1.com",
                    "ALLOW-FROM example2.com",
                    "ALLOW-FROM example3.com",
                    "ALLOW-FROM example4.com",
                    "ALLOW-FROM example5.com"));
}

答案 5 :(得分:0)

您可以使用X-Content-Security-Policy和Content-Security-Policy代替X-Frame-Options,它们提供了更大的灵活性,允许iframe使用通配符访问多个域。

这里是一个例子-

http.csrf().disable()
.headers().addHeaderWriter(new StaticHeadersWriter(
        "X-Content-Security-Policy",
        "frame-ancestors self *.domain1.com *.domain2.com"))
.and()
.headers().addHeaderWriter(new StaticHeadersWriter(
        "Content-Security-Policy",
        "frame-ancestors self *.domain1.com *.domain2.com"))

X-Frame-Options值将被丢弃。