У меня возникла проблема при добавлении 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 без заголовка в ответе.
Что я здесь пропустил?




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