Как отключить CORS на шлюзе? Я имею в виду действительно отключить, не разрешать запросы из всех источников со всеми методами, которые вы найдете при поиске «отключить CORS шлюза» в stackoeverflow или где-либо еще.
У меня есть spring-cloud-gateway перед несколькими службами, которые уже позиционируют заголовки CORS ответа (Access-Control-Allow-Origin и подобные), и для некоторых из этих служб я с трудом могу отключить CORS (например, Keycloak).
Моя проблема заключается в том, что spring-cloud-gateway также устанавливает некоторые из этих заголовков, что приводит к дублированию заголовков CORS и ошибке CORS в клиентском приложении. Поэтому я хотел бы полностью отключить фильтры CORS на шлюзе (в идеале глобально, но конфигурация filter для применения к каждому маршруту также была бы приемлемой)
Конфигурация шлюза:
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0-RC2</version>
<relativePath />
</parent>
<groupId>com.c4-soft.user-proxies</groupId>
<artifactId>gateway</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2022.0.0-RC1</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping=true
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowed-origins=*
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowed-headers=*
spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowed-methods=*
spring.cloud.gateway.globalcors.corsConfigurations.[/**].exposed-headers=*
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(p -> p.path("/users/**").uri("https://localhost:9443"))
.route(p -> p.path("/greet/**").uri("https://localhost:9445"))
.route(p -> p.path("/realms/**").uri("https://localhost:8443"))
.build();
}
}
При попытке пройти через шлюз (отправить все запросы на порт 8080) с включенным CORS на серверах ресурсов я получаю ошибки cors и заголовки ответов, содержащие двойные заголовки CORS:
При настройке на прямое подключение (обратитесь к серверам ресурсов через порты 9443 и 9445) запросы Angular выполняются успешно.
Если я отключу CORS на серверах-ресурсах (на портах 9443 и 9445), то заголовки CORS больше не дублируются и запросы через шлюз выполняются успешно (но прямые запросы не выполняются).





Я нашел способ дедупликации заголовков CORS на шлюзе:
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder, Function<GatewayFilterSpec, UriSpec> brutalCorsFilters) {
return builder.routes()
.route(p -> p.path("/users/**").filters(brutalCorsFilters).uri("https://localhost:9443"))
.route(p -> p.path("/greet/**").filters(brutalCorsFilters).uri("https://localhost:9445"))
.route(p -> p.path("/realms/**").filters(brutalCorsFilters).uri("https://localhost:8443"))
.build();
}
@Bean
Function<GatewayFilterSpec, UriSpec> brutalCorsFilters() {
return f -> f
.setResponseHeader("Access-Control-Allow-Origin", "*")
.setResponseHeader("Access-Control-Allow-Methods", "*")
.setResponseHeader("Access-Control-Expose-Headers", "*");
}
При этом конфигурация CORS может оставаться активной на серверах ресурсов (но будет игнорироваться).
Я бы предпочел отключить процессор CORS шлюза и сохранить заголовки CORS ресурсов-серверов, но, по крайней мере, это можно использовать.
Свойства тоже важны. Убедитесь, что у вас одинаковая конфигурация в файле свойств и в "brutalCorsFilter". И, конечно же, убедитесь, что «brutalCorsFilter» правильно применен к маршруту, с которым у вас возникла проблема с CORS (установите точку останова или запись в журнале)
Если я добавлю ваш код в файл свойств, я получу сообщение об ошибке «Ошибка синтаксического анализа заголовка HTTP-запроса. Примечание: дальнейшие ошибки синтаксического анализа HTTP-запроса будут регистрироваться на уровне DEBUG». в Ресурс-сервере
Скорее всего, у вас сейчас другая проблема. Работает ли прямой вызов (что будет, если настроить клиента на вызов внутреннего порта ресурса-сервера вместо порта шлюза)?
Ваш вариант у меня сработал, но только после того, как я настроил поддержку cors на сервере ресурсов
Если вы внимательно прочитали мой вопрос, вы можете заметить, что моя проблема заключалась именно в том, как настроить шлюз, когда заголовки CORS уже установлены ресурсом-сервером.
Я попытался повторить ваш код. Ресурс сервера оставлен без изменений с включенным cors. И я переписал GateWay, как в вашем вопросе. Но я все еще получаю ошибку cors при отправке запроса Get на сервер-ресурс через GateWay