Настройка корса в приложении Spring Boot. Bean CorsConfigurationSource не работает

Поэтому я не могу настроить cors. Мое приложение angular не может отправить запрос api из-за ошибки. Я могу выполнять запросы с помощью soapUI, и они работают нормально. Но из браузера есть:

Доступ к XMLHttpRequest в 'http://localhost:8080/backend/api/public' из origin 'http://localhost:4200' заблокирован политикой CORS: No 'Access-Control-Allow-Origin 'присутствует в запрошенном ресурсе.

Я искал ответы, и они похожи на мой класс.

Я использую весеннюю загрузку веб-безопасности.

@EnableWebSecurity
@Configuration
public class AuthConfig extends WebSecurityConfigurerAdapter {

    @Value(value = "${auth0.apiAudience}")
    private String apiAudience;
    @Value(value = "${auth0.issuer}")
    private String issuer;


    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("http://localhost:4200"));
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        configuration.setAllowCredentials(true);
        configuration.addAllowedHeader("Authorization");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",configuration);
        return source;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        JwtWebSecurityConfigurer
                .forRS256(apiAudience, issuer)
                .configure(http)
                .authorizeRequests()
                .antMatchers(HttpMethod.GET,"/api/public").permitAll()
                .antMatchers(HttpMethod.GET, "/api/private").authenticated()
                .antMatchers(HttpMethod.GET, "/api/private-scoped").hasAnyAuthority("read:posts");
    }
}

Этот bean-компонент должен добавить этот заголовок cors, но этого не происходит. Может быть, вы знаете, как это сделать получше? В чем разница между WebSecurityConfigurerAdapter и WebMvcConfigurerAdapter?


person K4mczi    schedule 03.04.2019    source источник


Ответы (2)


Согласно это вы также следует добавить .cors().and() в ваш configure() метод.

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

Однако, если вы хотите включить CORS для всего приложения, первый способ намного красивее.

Разница между WebSecurityConfigurerAdapter и WebMvcConfigurerAdapter заключается в том, что WebSecurityConfigurerAdapter используется для настройки всего, что связано с безопасностью вашего веб-приложения, например аутентификации и авторизации. С помощью WebMvcConfigurerAdapter вы можете настроить конфигурацию на основе Java для Spring MVC.

person Naeramarth    schedule 03.04.2019
comment
Я попробовал первый способ, и когда я выполнял http.cors (), мой ide сказал мне, что он не может найти символ. - person K4mczi; 03.04.2019
comment
я могу дать вам ссылку на мое репо - person K4mczi; 03.04.2019
comment
Конечно, но только если вам это удобно. Вы уверены, что импортировали правильный HttpSecurity? Для меня org.springframework.security.config.annotation.web.builders.HttpSecurity в Spring Boot 2.0.0 есть метод cors(). - person Naeramarth; 03.04.2019
comment
Да, импорт - Coreet - person K4mczi; 03.04.2019
comment
Думаю, единственный способ помочь вам в дальнейшем - это просмотреть больше вашего кода ^^ Какую среду IDE вы используете? - person Naeramarth; 03.04.2019
comment
Я использую NetBeans - person K4mczi; 03.04.2019
comment
Ваша spring-security-config зависимость устарела и не поддерживает настройку cors. Для текущей версии (3.2.4) мне также не удалось использовать метод cors(). Либо удаление тега, либо обновление как минимум до версии 4.2.11 должно решить проблему. Я бы рекомендовал просто удалить его, так как тогда он будет использовать только родительскую версию. - person Naeramarth; 03.04.2019
comment
это одна деталь о версии - person K4mczi; 03.04.2019
comment
Но по-прежнему конфигурация jwt не работает для авторизованных запросов, знаете, почему? - person K4mczi; 03.04.2019
comment
У меня нет опыта работы с JwtWebSecurityConfigurer, я обычно просто настраиваю HttpSecurity-Object напрямую. Если это возможно для вас, я лично рекомендую и это, поскольку его очень просто (и очень похоже на JwtWebSecurityConfigurer) в использовании. Я проверю JwtWebSecurityConfigurer позже, если вы не нашли способ до тех пор. - person Naeramarth; 04.04.2019
comment
Я вхожу в свое угловое приложение. Затем я получаю токен доступа. Позже я делаю запросы api на свой бэкэнд, и мне нужен какой-то метод, который будет проверять этот токен, и на основе этого он предоставит области, которые пользователь имеет в этом токене, и вернет ресурсы на их основе. Большая часть интернет-информации, по-видимому, предназначена для обычных веб-приложений, где вся логика входа в систему находится на java. Но у меня есть SPA, использующий бэкэнд для api. - person K4mczi; 04.04.2019
comment
В этом есть смысл. Я посмотрю на это. - person Naeramarth; 04.04.2019

У меня была такая же проблема, и я не мог заставить работать bean-компонент CorsConfigurationSource. Поэтому я попробовал другой подход. Я не использовал конфигурацию bean-компонента CorsConfigurationSource. Вместо этого я использовал альтернативу реестра cors или глобальную конфигурацию CORS.

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
            .allowedOrigins("http://localhost:4200")
            .allowCredentials(true);
    }
}

Удалите компонент конфигурации CorsConfigurationSource из класса AuthConfig. Я получил этот фрагмент кода с https://www.baeldung.com/spring-cors

person Juan Cabello    schedule 23.01.2020