Включить подстановочный знак в CORS Spring Security + WebFlux - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть Spring Security + CORS включить в проект, который сделан с Spring WebFlux.Моя проблема здесь в том, что мы принимаем, например, запросы от: http://localhost:4200. Как я могу сделать так, чтобы CORS принимал запросы от http://*.localhost:4200 как http://a.localhost:4200, http://b.localhost:4200?

Мой конфиг CORS выглядит так:

@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public CorsWebFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);

    config.setAllowedOrigins(corsConfigData.getAllowedOrigins());
    config.setAllowedHeaders(corsConfigData.getAllowedHeaders());
    config.setAllowedMethods(corsConfigData.getAllowedMethods());

    source.registerCorsConfiguration("/**", config);
    return new CorsWebFilter(source);
}

У вас есть идеи ???

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Я думаю, что нашел решение, которое работает.Это просто означает создание пользовательской конфигурации CorsConfiguration, переопределение метода checkOrigin и создание пользовательского сопоставления, которое будет правильно интерпретировать http://*.localhost:4200.Код выглядит так:

public class RegexCorsConfiguration extends CorsConfiguration {

private List<String> allowedOriginsRegexes = new ArrayList<>();

/**
 * Check the origin of the request against the configured allowed origins.
 * @param requestOrigin the origin to check
 * @return the origin to use for the response, possibly {@code null} which
 * means the request origin is not allowed
 */
public String checkOrigin(String requestOrigin) {
    if (!StringUtils.hasText(requestOrigin)) {
        return null;
    }

    if (this.allowedOriginsRegexes.isEmpty()) {
        return null;
    }

    if (this.allowedOriginsRegexes.contains(ALL)) {
        if (getAllowCredentials() != Boolean.TRUE) {
            return ALL;
        } else {
            return requestOrigin;
        }
    }

    for (String allowedOriginRegex : this.allowedOriginsRegexes) {
        if (createMatcher(requestOrigin, allowedOriginRegex).matches()) {
            return requestOrigin;
        }
    }

    return null;
}

public void setAllowedOriginRegex(List<String> allowedOriginsRegexes) {
    this.allowedOriginsRegexes = allowedOriginsRegexes;
}

private Matcher createMatcher(String origin, String allowedOrigin) {
    String regex = this.parseAllowedWildcardOriginToRegex(allowedOrigin);
    Pattern pattern = Pattern.compile(regex);
    return pattern.matcher(origin);
}

private String parseAllowedWildcardOriginToRegex(String allowedOrigin) {
    String regex = allowedOrigin.replace(".", "\\.");
    return regex.replace("*", ".*");
}}

и, конечно, вставьте corsConfig из классов конфигурации следующим образом:

    @Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public CorsWebFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    RegexCorsConfiguration regexCorsConfiguration = new RegexCorsConfiguration();
    regexCorsConfiguration.setAllowCredentials(true);

    regexCorsConfiguration.setAllowedOriginRegex(corsConfigData.getAllowedOrigins());
    regexCorsConfiguration.setAllowedHeaders(corsConfigData.getAllowedHeaders());
    regexCorsConfiguration.setAllowedMethods(corsConfigData.getAllowedMethods());

    source.registerCorsConfiguration("/**", regexCorsConfiguration);
    return new CorsWebFilter(source);
}
0 голосов
/ 21 ноября 2018

Я думаю, что, как указано в ответах на этот вопрос, спецификация CORS не допускает подстановочные знаки для субдомена.В частности, см. https://www.w3.org/TR/cors/#access-control-allow-origin-response-header

. Вы можете последовать их совету по этому ответу и перенести обработку на некоторый уровень промежуточного программного обеспечения, например NGINX или Apache, который может динамически устанавливать заголовок CORS на основе домена в запросе, или указать всесубдомены, которые вы хотели бы использовать в конфигурации весенней загрузки, если это не приводит к неуправляемой сумме.

Хотя в первой части вашего вопроса вы утверждаете, что принимаете запросы от http://localhost:4200., это не должноне будет проблемой, если вам не нужны субдомены, тогда вы можете просто явно внести белый список в этот домен, или я неправильно понял?

...