Как мне складывать фильтры CORS для разных URL?

darksmurf спросил: 03 ноября 2018 в 09:18 в: java

В качестве бэкэнда для моего приложения React у меня есть REST API Spring Boot 2. Веб-сайт и API размещены в разных поддоменах (https://example.com и https://api.example.com соответственно), поэтому я настроил фильтр CORS для поддержки этого:

@Bean
public FilterRegistrationBean corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();    CorsConfiguration apiCorsConfig = new CorsConfiguration();
    apiCorsConfig.addAllowedOrigin("https://example.com");
    apiCorsConfig.addAllowedHeader(CorsConfiguration.ALL);
    apiCorsConfig.addAllowedMethod(CorsConfiguration.ALL);
    apiCorsConfig.setMaxAge(600L);
    source.registerCorsConfiguration("/**", apiCorsConfig);    FilterRegistrationBean filterRegistrationBean =
        new FilterRegistrationBean<>(new CorsFilter(source));
    filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
    return filterRegistrationBean;
}

Это прекрасно работает.


Я реализовал Spring SAML для поддержки SAML в качестве альтернативного средства аутентификации на основе API. Все конечные точки SAML размещены в /saml/**. Запросы аутентификации SAML могут поступать из любого источника, поэтому мне нужно открыть эти конечные точки, чтобы разрешить запросы CORS из любого источника.

Я пробовал следующее:

@Bean
public FilterRegistrationBean corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();    CorsConfiguration apiCorsConfig = new CorsConfiguration();
    apiCorsConfig.addAllowedOrigin("https://example.com");
    apiCorsConfig.addAllowedHeader(CorsConfiguration.ALL);
    apiCorsConfig.addAllowedMethod(CorsConfiguration.ALL);
    apiCorsConfig.setMaxAge(600L);
    source.registerCorsConfiguration("/**", apiCorsConfig);    CorsConfiguration samlCorsConfig = new CorsConfiguration();
    samlCorsConfig.addAllowedOrigin(CorsConfiguration.ALL);
    samlCorsConfig.addAllowedHeader(CorsConfiguration.ALL);
    samlCorsConfig.addAllowedMethod(CorsConfiguration.ALL);
    samlCorsConfig.setMaxAge(600L);
    source.registerCorsConfiguration("/saml/**", samlCorsConfig);    FilterRegistrationBean filterRegistrationBean =
        new FilterRegistrationBean<>(new CorsFilter(source));
    filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
    return filterRegistrationBean;
}

Однако это не работает, и 403 Invalid CORS request возвращается, когда неизвестный источник пытается получить доступ к /saml/** конечным точкам.


Я полагаю, Проблема здесь заключается в том, что более общий шаблон /** имеет приоритет, даже когда существует более конкретный муравьиный шаблон /saml/**, соответствующий запросу.

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


Как разрешить любое происхождение получить доступ к /saml/**, в то же время позволяя https://example.com получить доступ ко всем остальным точкам /**?

0 ответов