Ответ 401 на запрос CORS preflight OPTIONS к серверу Springboot

Междоменный запрос от моего углового приложения к серверной части весенней загрузки блокируется CORS, только с помощью POST, PUT. GET разрешен и работает должным образом.

Вот мой конфиг..

Серверная часть:

корс фильтр -

@Configuration
public class CORSConfiguration {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();

        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.setAllowedOrigins(Arrays.asList("http://localhost:4200"));
        corsConfiguration.setAllowedMethods(Arrays.asList("PUT", "POST", "GET", "DELETE", "OPTIONS"));
        corsConfiguration.setAllowedHeaders(Arrays.asList("Origin", "X-Requested-With", "X-Requested-By",
                "Content-Type", "Accept", "Authorization"));
        source.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(source);
    }
}
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.cors().and()
                    .csrf().disable()
                    .authorizeRequests()
                    .antMatchers(HttpMethod.OPTIONS).permitAll()
                    .antMatchers("/*").authenticated().and()
                    .jee().mappableAuthorities("xxxxxxx");

    }
}

ng :

public postIT(payload: Data): Observable<Data> {
    return this.http.post<Data>(url, payload) , {
      withCredentials: true
    });
  }

Ошибки:

Что я здесь оставляю? Пожалуйста, дай мне знать.


person iManiac    schedule 10.11.2020    source источник
comment
Конкретная проблема заключается в том, что сервер отвечает ошибкой 401 на предварительный запрос CORS OPTIONS — по-видимому, потому, что он требует аутентификации для маршрута или запросов OPTIONS. Исправление заключается в том, что конфигурация сервера должна быть изменена таким образом, чтобы он разрешал неаутентифицированные запросы OPTIONS и отвечал на них 200 OK. См. ответ на странице stackoverflow.com/a/45406085/441757.   -  person sideshowbarker    schedule 11.11.2020
comment
Верно, я уже разрешаю запросам OPTIONS обходить аутентификацию. установив : .antMatchers(HttpMethod.OPTIONS,"/**").permitAll()   -  person iManiac    schedule 11.11.2020
comment
По-видимому, этого обхода недостаточно для предотвращения того, чтобы этот маршрут разрешал неаутентифицированные запросы OPTIONS. В противном случае вы бы не получили ответ 401 на запрос OPTIONS. Изображение на i.stack.imgur.com/9ojsO.jpg определенно показывает, re получаю ответ 401 на запрос OPTIONS.   -  person sideshowbarker    schedule 11.11.2020


Ответы (2)


Ошибка, которую я сделал, была в файле web.xml, в котором OPTIONS были включены в элемент <security-constraint>.

Удалил отсюда и с остальным конфигом как есть, больше не вижу проблемы.

введите здесь описание изображения

person iManiac    schedule 11.11.2020

Не могли бы вы попробовать заменить AllowedHeaders следующим списком:

Access-Control-Allow-Credentials, Content-Type, Access-Control-Allow-Headers, X-Requested-With, Origin, Accept

person Andrian Soluk    schedule 10.11.2020
comment
Просто для понимания, не могли бы вы объяснить, почему это поможет. - person iManiac; 10.11.2020
comment
Заголовок Access-Control-Allow-Credentials сообщает браузерам, следует ли предоставлять ответ внешнему коду JavaScript в режиме учетных данных запроса. Заголовок Access-Control-Request-Headers используется браузерами при выдаче предварительного запроса, чтобы сообщить серверу, какие HTTP-заголовки клиент может отправить при выполнении фактического запроса. - person Andrian Soluk; 10.11.2020
comment
Пробовал вышеперечисленное, и проблема все еще остается. - person iManiac; 10.11.2020