Проблема Spring CORS Filter в свете микросервисов Spring Cloud с Zuul - PullRequest
0 голосов
/ 28 декабря 2018

С учетом : приложение углового интерфейса отправляет запросы в микросервис бэкэнда через микросервис шлюза.Бэкэнд находится в Spring Cloud.

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

Access to XMLHttpRequest at 'http://gateway-service:5555/api/useful-service/myentities/' from origin 'http://localhost:4200' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header contains multiple values 'http://localhost:4200, http://localhost:4200', but only one is allowed.

Вот что я написал такfar:

Служба шлюза

Мой основной класс в сервисе шлюза имеет 3 аннотации: @SpringBootApplication, @EnableZuulProxy и @Configuration.Так как я не настраивал никакие параметры безопасности, я предполагаю, что Spring Security не используется, поэтому мне нужно настроить CorsFilter в Spring MVC.Я делаю это следующим образом (комментарии для будущих пользователей) :

@Bean
public CorsFilter corsFilter() {
    CorsConfiguration corsConfig = new CorsConfiguration();
    corsConfig.setAllowCredentials(true);
    //corsConfig.addAllowedOrigin("http://localhost:4200");
    corsConfig.addAllowedOrigin("*"); //wildcard that will simply copy the value of the request's Origin header
    // into the value of the Response's Access-Control-Allow-Origin header, effectively allowing all origins.
    // You can add specific origins instead if you wish to limit them.
    corsConfig.addAllowedHeader("*");
    corsConfig.addAllowedMethod("OPTIONS");
    corsConfig.addAllowedMethod("HEAD");
    corsConfig.addAllowedMethod("GET");
    corsConfig.addAllowedMethod("POST");
    corsConfig.addAllowedMethod("PUT");
    corsConfig.addAllowedMethod("DELETE");
    corsConfig.addAllowedMethod("PATCH");
    UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
    configSource.registerCorsConfiguration("/**", corsConfig);
    return new CorsFilter(configSource);
}

Полезное обслуживание

Основной класс здесь аннотирован @EnableResourceServer и @SpringBootApplication.В соответствии с моими «бизнес-правилами» я хотел бы иметь авторизацию Spring (безопасность URL-адресов, а в будущем и безопасность методов), так как я настраивал Spring Security в целом и OAuth2, а в частности я должен также настраивать фильтр cors безопасности.Вот соответствующий фрагмент кода безопасности, который включает cors:

@Configuration
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .cors(); // by default uses a Bean by the name of corsConfigurationSource
    }
}

И вот как я настраиваю функцию cors в Spring Security:

@Bean
CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Arrays.asList("*"));
    configuration.setAllowedMethods(Arrays.asList("GET", "POST", "OPTIONS", "DELETE", "PUT", "PATCH"));
    configuration.setAllowedHeaders(Arrays.asList("X-Requested-With", "Origin", "Content-Type", "Accept", "Authorization"));
    configuration.setAllowCredentials(true);
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

К сожалению, я получил ошибку, упомянутую выше, если у вас естьИдея как это исправить пожалуйста сказка.

...