X-Frame DENY в безопасности Spring

Я использую плагин загрузки jquery в моем весеннем проекте, но браузер выдает следующую ошибку:

Refused to display 'http://localhost:8086/DART/fleetAndCar/download/5' in a frame because it set 'X-Frame-Options' to 'DENY'.

Я читал, что это проблема с Xframe в весенней безопасности, поэтому я добавил

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

но это не меняет DENY, а добавляет даже SAMEORIGIN, поэтому у меня есть следующая ошибка:

Multiple 'X-Frame-Options' headers with conflicting values ('DENY, SAMEORIGIN') encountered when loading 'http://localhost:8086/DART/fleetAndCar/download/5'. Falling back to 'DENY'.

и это http-запрос:

введите здесь описание изображения

это моя весенняя конфигурация:

@Configuration
    @Order(1)
    public static class ApiWebSecurityConfig extends WebSecurityConfigurerAdapter{
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
            .antMatcher("/client/**")
            .authorizeRequests()
            //Exclude send file from authentication because it doesn't work with spring authentication
            .antMatchers(HttpMethod.POST, "/client/file").permitAll()
            .anyRequest().authenticated()
            .and()
            .httpBasic();
        }
    }

    @Configuration
    @Order(2)
    public static class FormWebSecurityConfig extends WebSecurityConfigurerAdapter{

        @Autowired
        RoleServices roleServices;

        @Override
        public void configure(WebSecurity web) throws Exception {
            web
            //Spring Security ignores request to static resources such as CSS or JS files.
            .ignoring()
            .antMatchers("/static/**");
        }

        @Override
        protected void configure(HttpSecurity http) throws Exception {         
            List<Role> roles=roleServices.getRoles();
            //Retrieve array of roles(only string field without id)
            String[] rolesArray = new String[roles.size()];
            int i=0;
            for (Role role:roles){
                rolesArray[i++] = role.getRole();
            }

            http
            .headers()
               .addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN))
               .and()
            .authorizeRequests() //Authorize Request Configuration
            .anyRequest().hasAnyRole(rolesArray)//.authenticated()
            .and() //Login Form configuration for all others
            .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
            .exceptionHandling().accessDeniedPage("/403")
            .and()
            .logout()
            .logoutSuccessUrl("/login?logout")
            .permitAll();

        }
    }

Как я могу решить эту проблему? Спасибо (загрузка работает нормально, несмотря на ошибку)


person luca    schedule 13.04.2016    source источник


Ответы (2)


Вы можете сделать это в файле конфигурации безопасности spring следующим образом:

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

Также вы можете сделать это с конфигурацией java следующим образом:

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends
        WebSecurityConfigurerAdapter {

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

Для более старых весенних версий используйте:

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

Вместо:

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

Наконец. Вот доступные варианты:

ЗАПРЕТИТЬ: ни одному домену не разрешается отображать эту страницу во фрейме.

SAMEORIGIN: позволяет отображать текущую страницу во фрейме на другой странице, но только в пределах текущего домена.

РАЗРЕШИТЬ ОТ: позволяет отображать текущую страницу во фрейме, но только в определенном URI. Например, www.example.com/frame-page.

person John Alexander Betts    schedule 08.10.2019

пытаться

 http
        .headers()
        .frameOptions()
        .sameOrigin();
person Mix    schedule 13.02.2017
comment
Не могли бы вы предоставить нам более подробную информацию, связанную с вашим кодом.? Спасибо - person Robert; 14.02.2017
comment
@ Роберт, на всякий случай, я должен ответить на вопрос более подробно. - person John Alexander Betts; 08.10.2019