Spring Gateway Security Access-Control-Allow-Origin в ОПЦИЯХ, но не POST

У меня возникла проблема при добавлении Spring Security в приложение Spring Gateway. Я не знаю, актуально ли это, но я использую Spring-Boot-Starter-Parent 2.5.8.

Первоначально я создал приложение-шлюз без Spring Security, чтобы проверить, работает ли маршрутизация к другому API, используя его URL-адрес eureka. Это сработало нормально. 200 ответов получено с этой конфигурацией:

@Configuration
public class RouterConfig {
    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("account", r -> r
                        .path("/account/**")
                        .filters(f -> f.stripPrefix(1).prefixPath("/java-app-account/v1"))
                        .uri("lb://JAVA-APP-ACCOUNT")
                        
                    )
                
                .build();
    }
}

Поэтому, когда я добавил безопасность весенней загрузки, очевидно, что CORS срабатывает с запрещенной ошибкой 403, поэтому я добавляю следующие конфигурации:

@Configuration
@EnableConfigurationProperties(value = {GlobalCorsProperties.class})
public class SpringSecurityConfig {
     @Bean
      SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) throws Exception {
        http
                .authorizeExchange()
                .pathMatchers(HttpMethod.OPTIONS,"/account/**").permitAll()
                 .pathMatchers(HttpMethod.POST,"/account/**").permitAll()
                 ;
        return http.build();
      }
}

И

public class CustomCorsConfiguration {

    @Bean
    public WebFilter corsFilter() {
        return (ServerWebExchange ctx, WebFilterChain chain) -> {
            ServerHttpRequest request = ctx.getRequest();
            if (CorsUtils.isCorsRequest(request)) {
                ServerHttpResponse response = ctx.getResponse();
                HttpHeaders headers = response.getHeaders();
                headers.add("Access-Control-Allow-Origin", "http://localhost:4200");
                headers.add("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS, PATCH");
                headers.add("Access-Control-Max-Age", "7200"); 
                headers.add("Access-Control-Allow-Headers",
                        "x-requested-with, authorization, Content-Type, Content-Length, Authorization, credential, X-XSRF-TOKEN");
                if (request.getMethod() == HttpMethod.OPTIONS) {
                    response.setStatusCode(HttpStatus.OK);
                    return Mono.empty();
                }
            }
            return chain.filter(ctx);
        };
    }
}

У меня проблема в том, что предполетный запрос OPTIONS возвращает заголовок Access-Control-Allow-Headers, но POST отклоняется с ошибкой Forbidden без заголовка в ответе.

Что я здесь пропустил?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
0
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Фильтр CSRF останавливал запрос до того, как фильтр CORS смог добавить заголовки. отключение защиты CSRF решает проблему. Я добавлю защиту CSRF и проверю, что токен теперь передан.

Другие вопросы по теме