Как отключить заголовок ответа "X-Frame-Options" в Spring Security?

У меня есть CKeditor на моем JSP, и всякий раз, когда я загружаю что-то, появляется следующая ошибка:

 Refused to display 'http://localhost:8080/xxx/xxx/upload-image?CKEditor=text&CKEditorFuncNum=1&langCode=ru' in a frame because it set 'X-Frame-Options' to 'DENY'.

Я попытался удалить Spring Security, и все работает как шарм. Как я могу отключить это в весеннем файле безопасности XML? Что я должен написать между <http> теги

8 ответов

Решение

По умолчанию X-Frame-Options установлен как запрещенный, чтобы предотвратить атаки с помощью кликджекинга. Чтобы переопределить это, вы можете добавить следующее в конфигурацию безопасности Spring

<http>    
    <headers>
        <frame-options policy="SAMEORIGIN"/>
    </headers>
</http>

Здесь доступны варианты политики

  • DENY - это значение по умолчанию. При этом страница не может отображаться в рамке, независимо от того, какой сайт пытается это сделать.
  • SAMEORIGIN - я предполагаю, что это то, что вы ищете, так что страница будет (и может быть) отображена в рамке того же источника, что и сама страница
  • ALLOW-FROM - позволяет указать источник, где страница может отображаться во фрейме.

Для получения дополнительной информации посмотрите здесь.

И здесь, чтобы проверить, как вы можете настроить заголовки, используя конфиги XML или Java.

Обратите внимание, что вам может потребоваться также указать соответствующие strategy, исходя из потребностей.

Если вы используете конфиги Java вместо конфигов XML, укажите это в своем методе "WebSecurityConfigurerAdapter.configure(HttpSecurity http)":

http.headers().frameOptions().disable();

Скорее всего, вы не хотите полностью деактивировать этот заголовок, но используйте SAMEORIGIN, Если вы используете Java Configs (Spring Boot) и хотел бы разрешить X-Frame-Options: SAMEORIGIN, тогда вам нужно будет использовать следующее.


Для более старых версий Spring Security:

http
   .headers()
       .addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN))

Для более новых версий, таких как Spring Security 4.0.2:

http
   .headers()
      .frameOptions()
         .sameOrigin();

Если вы используете конфигурацию XML, вы можете использовать

<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:security="http://www.springframework.org/schema/security"> 
<security:http>
    <security:headers>
         <security:frame-options disabled="true"></security:frame-options>
    </security:headers>
</security:http>
</beans>

Если вы используете конфигурацию Java Spring Security, по умолчанию добавляются все заголовки безопасности по умолчанию. Их можно отключить с помощью конфигурации Java ниже:

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends
   WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
      .headers().disable()
      ...;
  }
}

Если вы используете Spring Boot, самый простой способ отключить заголовки Spring Security по умолчанию - это использовать security.headers.* свойства. В частности, если вы хотите отключить X-Frame-Options заголовок по умолчанию, просто добавьте следующее к вашему application.properties:

security.headers.frame=false

Существует также security.headers.cache, security.headers.content-type, security.headers.hsts а также security.headers.xss свойства, которые вы можете использовать. Для получения дополнительной информации, посмотрите на SecurityProperties,

Вы должны настроить несколько экземпляров HttpSecurity.

Вот мой код, в котором только запросы /public/** без заголовка X-Frame-Options .

      @Configuration
public class SecurityConfig {

/**
 * Public part - Embeddable Web Plugin
 */

@Configuration
@Order(1)
public static class EmbeddableWebPluginSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
    protected void configure(HttpSecurity http) throws Exception {
        // Disable X-Frame-Option Header
        http.antMatcher("/public/**").headers().frameOptions().disable();
    }
}

/**
 * Private part - Web App Paths
 */

@Configuration
@EnableOAuth2Sso
public static class SSOWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
                .csrf().disable()
                .antMatcher("/**")
                .authorizeRequests()
                .antMatchers("/public/**", "/", "/login**", "/webjars/**", "/error**", "/static/**", "/robots", "/robot", "/robot.txt", "/robots.txt")
                .permitAll()
                .anyRequest()
                .authenticated()
                .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/bye");
    }

    /**
     * Public API endpoints
     */

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

.csrf().disable()это опасно.

тест:

      .headers().frameOptions().sameOrigin()
Другие вопросы по тегам