Как отключить заголовок ответа "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()