Весна - CORS не работает с Security Config - PullRequest
0 голосов
/ 27 декабря 2018

Я разрабатываю угловое приложение с пружинным веб-флюксом.До сих пор CorsFilter работал нормально и разрешал запросы от внешнего интерфейса.

Затем я добавил SecurityConfig.С тех пор CorsFilter перестал работать, и я получаю исключение в угловом приложении:

Доступ к XMLHttpRequest в «http://localhost:8080/users/999/folders/%2F/media/' от источника» http://localhost:4200' был заблокирован CORSполитика: Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin»

Этот фильтр работал нормально:

@Configuration
public class CorsFilter {

    private static final String FRONTEND_LOCALHOST = "http://localhost:4200";
    private static final String FRONTEND_STAGING = "https://somehost.github.io";

    @Bean
    CorsWebFilter corsWebFilter() {
        CorsConfiguration corsConfig = new CorsConfiguration();
        corsConfig.applyPermitDefaultValues();
        corsConfig.addAllowedMethod(HttpMethod.PUT);
        corsConfig.addAllowedMethod(HttpMethod.DELETE);
        corsConfig.setAllowedOrigins(Arrays.asList(FRONTEND_LOCALHOST, FRONTEND_STAGING));

        UrlBasedCorsConfigurationSource source =
                new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfig);

        return new CorsWebFilter(source);
    }
}

Затем я добавил авторизацию (токен на предъявителя) со следующим SecurityConfig:

@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
public class SecurityConfiguration {

    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        http.cors().and().csrf()
            .csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse())
            .and()
            .authorizeExchange()
            .anyExchange().authenticated()
            .and()
            .oauth2ResourceServer()
            .jwt();
        return http.build();
    }

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

РЕДАКТИРОВАТЬ: Для решения проблем дублирования: я уже пытался добавить cors() и cors().configurationSource(corsConfig()) в мою конфигурацию безопасности, но тоже не помогло.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Я нашел рабочий способ в Включить CORS в Spring 5 Webflux? , внедрив пользовательский corsfilter.

Однако я все еще не был доволен решением, так как оно выглядело как обходной путь.

Наконец я нашел виновника (-ов) ... одно весьма смущает.Мой отправленный SecurityConfig был в неправильном пакете (он был в пакете по умолчанию случайно), и по этой причине конфиг не поднялся.

Также фильтр cors из вопроса начал работать, когда я вставил код вsecurityconfig.

Итак, мой последний SecurityConfig выглядит так:

import java.util.Arrays;

import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.server.SecurityWebFilterChain;
import org.springframework.security.web.server.csrf.CookieServerCsrfTokenRepository;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsConfigurationSource;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;

@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
public class SecurityConfiguration {

    private static final String FRONTEND_LOCALHOST = "http://localhost:4200";
    private static final String FRONTEND_STAGING = "https://somehost.github.io";

    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        http
                .csrf()
                .csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse())
                .and()
                .authorizeExchange()
                .anyExchange().authenticated()
                .and()
                .oauth2ResourceServer()
                .jwt();
        return http.build();
    }


    @Bean
    CorsConfigurationSource corsConfiguration() {
        CorsConfiguration corsConfig = new CorsConfiguration();
        corsConfig.applyPermitDefaultValues();
        corsConfig.addAllowedMethod(HttpMethod.PUT);
        corsConfig.addAllowedMethod(HttpMethod.DELETE);
        corsConfig.setAllowedOrigins(Arrays.asList(FRONTEND_LOCALHOST, FRONTEND_STAGING));

        UrlBasedCorsConfigurationSource source =
                new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfig);
        return source;
    }
}
0 голосов
/ 27 декабря 2018

попробуйте добавить этот конфиг

corsConfig.setAllowCredentials(true);
...