Глобальная конфигурация CORS нарушается при переходе на Spring Boot 2.0.x - PullRequest
0 голосов
/ 05 мая 2018

Почему мои «Access-Control-Allow-Credentials» больше не отправляются в ответ на предварительные вызовы (OPTIONS) в Spring Boot 2.0.x (2.0.1.RELEASE в моем случае)? Вот моя Глобальная Конфигурация CORS, которая отлично работает под Spring Boot 1.5.6:

@Configuration
public class CorsConfig {

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins(
                        "http://localhost:3000",..)
                    .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD");
        }
    };
}}

Мои зависимости от pom (я занимаюсь собственной безопасностью и избегаю Spring Security):

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

Мой сервисный вызов к конечным точкам REST не проходит предварительную проверку:

Не удалось загрузить http://localhost:8080/api/v5/sec/auth: Ответ на запрос предварительной проверки не проходит проверку контроля доступа: значение заголовка 'Access-Control-Allow-Credentials' в ответе равно '', которое должно быть 'true' когда режим учетных данных запроса «включить». Источник 'http://localhost:3000' поэтому не имеет доступа.

Я проверил, что заголовок «Access-Control-Allow-Credentials» действительно присутствует в случае Spring Boot 1.5.6 и отсутствует в Spring Boot 2.0.1.

Вся документация, которую я могу найти, включая последнюю версию по адресу spring.io здесь , говорит, что моя глобальная конфигурация по-прежнему верна, хотя WebMvcConfigurerAdapter кажется устаревшим.


UPDATE:


Вот заголовки ответа до и после миграции:

Перед миграцией (Spring Boot 1.5.6):

Access-Control-Allow-Credentials: true
Контроль доступа-Разрешить происхождение: http://localhost:3000
Тип содержимого: application / json; charset = UTF-8
Дата: день, дд пн гггг чч: мм: сс GMT
Передача-кодировка: чанки
Варь: Происхождение

После миграции (Spring Boot 2.0.1 - отсутствует заголовок Access-Control-Allow-Credentials, но другие изменены / добавлены):

Access-Control-Allow-Headers: content-type
Access-Control-Allow-Methods: GET, HEAD, POST <- Мои указанные методы игнорируются </strong>
Access-Control-Allow-Origin: * <- Мой указанный источник игнорируется </strong>
Access-Control-Max-Age: 1800
Длина контента: 0
Дата: день, дд пн гггг чч: мм: сс GMT
Варь: Происхождение
Варьируется: Access-Control-Request-Method
Варьируется: Access-Control-Request-Headers

Ответы [ 4 ]

0 голосов
/ 06 мая 2019

Это работает для меня (Котлин):

@Configuration
class CorsConfig : WebMvcConfigurer {
    override fun addCorsMappings(registry: CorsRegistry) {
        registry.addMapping("/**")
    }
}
0 голосов
/ 06 января 2019

Если вы используете Spring Boot 2.0.x

Поддержка CORS по умолчанию отключена и включается только после установки свойства management.endpoints.web.cors.allowed-origins. Следующая конфигурация разрешает вызовы GET и POST из домена example.com:

management.endpoints.web.cors.allowed-происхождение = http://example.com management.endpoints.web.cors.allowed-методы = GET, POST

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

0 голосов
/ 28 марта 2019

Я использую весеннюю загрузку 2.0.2. У меня та же проблема, но я использую следующий код, чтобы исправить ее. У кого-нибудь есть лучший способ?

//    Miss `Access-Control-Allow-Origin` header in response using this bean. 
//    @Bean
//    CorsConfigurationSource corsConfigurationSource() {
//        CorsConfiguration configuration = new CorsConfiguration();
//        configuration.setAllowCredentials(true);
//        configuration.setAllowedHeaders(Arrays.asList("Authorization", "Cache-Control", "Content-Type"));
//        configuration.addAllowedMethod("*");
//        configuration.setAllowedOrigins(this.getAllowedOrigins());
//        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
//        source.registerCorsConfiguration("/**", configuration);
//        return source;
//    }

    @Bean
    public FilterRegistrationBean<CorsFilter> initCorsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.setAllowedHeaders(Arrays.asList("Authorization", "Cache-Control", "Content-Type"));
        config.addAllowedMethod("*");
        config.setAllowedOrigins(this.getAllowedOrigins());
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return bean;
    }
0 голосов
/ 08 мая 2018

Этого не хватало в документе Spring и во многих примерах, но ответ был очень прост. Я только что увидел метод allowCredentials () в CorsRegistry и добавил .allowCredentials (true) в цепочку методов реестра, а затем снова добавил заголовок Access-Control-Allow-Credentials.

Кроме того, я больше не использую устаревший WebMvcConfigurerAdapter, но теперь реализую WebMvcConfigurer и переопределяю метод addCorsMappings ().

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("/**")
                .allowedOrigins(
                        "http://localhost:3000",..)
                .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD")
                .allowCredentials(true)
        ;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...