#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, если бы это решило вашу проблему, я был бы признателен за голосование / принятие его в качестве ответа