Весенняя загрузка, проблема с конфигурацией Cors безопасности: ответ на предполетный запрос не проходит проверку контроля доступа: у него нет статуса HTTP ok

#java #spring #spring-boot #spring-mvc #spring-security

#java #spring #spring-boot #spring-mvc #spring-безопасность

Вопрос:

Я кодирую api в spring boot и spring security, к которому обращается интерфейс react, методы get работают хорошо. Но когда дело доходит до сообщений, где у нас есть параметры в качестве предполетного, он возвращает статус http 401. Пока я разрабатываю, я просто хочу, чтобы cors ничего не блокировал. Эта ошибка не возникает в Insomnia или postman, где я могу выполнять запросы без этой ошибки. Основной конечной точкой, в которой возникает эта ошибка, является /oauth/token , то есть конечная точка spring boot по умолчанию для получения токена-носителя, сообщение, которое я отправляю туда с помощью приложения react, получает эту ошибку:

 Access to XMLHttpRequest at 'http://localhost:8080/oauth/token' from origin 
'http://localhost:3000' has been blocked by CORS policy: Response to preflight 
request doesn't pass access control check: It does not have HTTP ok status.
  

Мои конфигурации spring:

WebConfig

 @Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
        .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS",  "HEAD", "TRACE", "CONNECT");
    }
}
  
 @EnableWebSecurity
@EnableAuthorizationServer
@EnableResourceServer
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .cors()
                .and()
                .csrf().disable();
    }
}
  

После выполнения некоторых поисков я думаю, что это cors или какое-то разрешение, которое мне не дано, но будут рассмотрены другие подходы.

Ответ №1:

AFAIK для правильной настройки CORS вам также необходимо указать разрешенные источники, заголовки и другие данные, если это применимо для вашего варианта использования. Таким образом, ваше сопоставление CORS станет:

 @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") //or whichever methods you want to allow
                .allowedOrigins("*") //or www.example.com if you want to be more specific
                .allowedHeaders("Content_Type", "Authorization"); //i also put Authorization since i saw you probably want to do so
    }
  

Проверьте эту картинку, возможно, она поможет вам лучше понять, как это работает.

Комментарии:

1. Хорошо, и если на данный момент я хочу разрешить все заголовки, могу ли я указать («*»)?

2. @IgorFroehner, согласно документации allowedHeaders() метода, да — » * » может использоваться для разрешения всех заголовков. Более того, по умолчанию разрешены все заголовки. См. docs.spring.io/spring-framework/docs/current/javadoc-api/org /…

3. @IgorFroehner, если бы это решило вашу проблему, я был бы признателен за голосование / принятие его в качестве ответа