Netflix Zuul CORS

Привет всем экспертам по весенней загрузке / облаку / Netflix Zuul!

Я запускаю среду микросервисов с использованием компонентов Netflix OSS и Spring Boot с использованием eureka и Zuul для обнаружения и маршрутизации сервисов. Несколько микросервисов развертываются на нескольких VPS через докер. Я запускаю клиент Angular JS, который обращается к этим микросервисам через единую конечную точку с использованием маршрутизации Zuul.

Я использую yeoman hottowel для angular scaffolding для быстрого развития, которое это позволяет, однако у меня возникла проблема с CORS, поскольку веб-сервер работает на localhost: 3000 и пытается вызвать конечную точку RESTful через маршрутизатор Zuul, работающий в другом месте.

Я поигрался с фильтрами Zuul (pre, route и post), чтобы попытаться добавить в ответ соответствующие заголовки управления доступом, и я вижу, что это работает, когда я отправляю запрос POST от клиента Rest (я использую Paws), но когда запрос отправляется через angular JavaScript, запущенный в браузере, запрос CORS preflight OPTIONS не обрабатывается фильтром, на самом деле Zuul возвращает ошибку 403, а браузер, конечно, сообщает об ошибке CORS.

Возможно, в процессе производства я могу обслуживать JavaScript с конечной точки Zuul и не сталкиваться с этой проблемой, но я хотел бы знать, есть ли способ настроить всю обработку CORS в Zuul?


person zinc wombat    schedule 02.03.2016    source источник
comment
Какую ошибку вы получаете? У меня также возникает проблема с AngularJS с удвоением заголовков CORS, что, я думаю, происходит из-за того, что у меня есть фильтр CORS в моем шлюзе API (прокси Zuul) и моем сервере ресурсов (службе).   -  person Kent Bull    schedule 16.03.2016
comment
Я не получал ни одного заголовка CORS от Zuul. Я временно отключил Зуула, пока не разберусь в этом. Я подозреваю, что я просто постараюсь не быть слишком умным и позволю серверам ресурсов обрабатывать CORS и Zuul proxy все. Я обновлю этот пост, когда у меня будет обновление. В принципе, я по-прежнему считаю хорошей идеей позволить Zuul обрабатывать CORS и аутентификацию.   -  person zinc wombat    schedule 22.03.2016


Ответы (3)


У меня была такая же проблема с настраиваемыми фильтрами cors. Я решил это, добавив код в проект zuul следующим образом:

 @Bean
public FilterRegistrationBean corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    source.registerCorsConfiguration("/**", config);
    FilterRegistrationBean bean = new FilterRegistrationBean(new org.springframework.web.filter.CorsFilter(source));
    bean.setOrder(0);
    return bean;
}

Я надеюсь, что это поможет вам!

person derrick.yang    schedule 18.09.2017
comment
куда добавить эти bean. Пожалуйста, укажите подробности. Я застрял в этой проблеме очень давно - person Pallavi; 27.01.2019

Я столкнулся с этой проблемой, поэтому предлагаю решение здесь ... По сути, нужно добавить реализацию WebMvcConfigurer. Версия Springboot: 2.3.2.RELEASE, версия Cloud: Hoxton.SR6 ... Подробнее см. эту ссылку

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Configuration
public class CorsConfig implements WebMvcConfigurer {

@Value("#{'${allowedOriginList}'.split(',')}") 
private String[]allowedOriginList;

@Override
public void addCorsMappings(CorsRegistry registry) {
    log.info("adding cors config");
    registry.addMapping("/**").allowedOrigins(allowedOriginsList).allowedMethods("*").allowedHeaders( "authorization").allowCredentials(true).exposedHeaders("Cache-Control", "Content-Type");

 }  
}

Затем определите свойство allowedOriginList в своем application.yml.

allowedOriginList:  http://localhost:4200
person Vikky    schedule 16.11.2020
comment
Я предпочитаю этот ответ, но вы забыли одну мелочь: вызов .allowedOrigins (*) должен использовать определенное свойство, например: .allowedOrigins (allowOriginList). Я предложил правку. - person rdhaese; 25.06.2021

Вы должны добавить CorsFilter внутри основного класса. В большинстве случаев это должно сработать. Но если у вас все еще есть предполетный CORS, попробуйте это.

Создайте новый класс под названием ZuulSecurity.

@Configuration
@EnableAutoConfiguration
public class ZuulSecurity extends WebSecurityConfigurerAdapter {
  @Override
  public void configure(HttpSecurity http) throws Exception {
    http.csrf().disable().antMatcher("/**")
            .authorizeRequests()
            .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
            .anyRequest().permitAll();
  }
}

Вы должны знать, что Zuul Proxy требует аутентификации. В процессе разработки добавление фрагмента кода, приведенного выше, позволит вашему шлюзу API разрешить предварительный запрос и удалить процесс аутентификации в Zuul.

person Minh Nguyen    schedule 03.07.2021