Почему я получаю ошибку Spring Boot (Java) Access-Control-Allow-Origin не может быть *, хотя он отправляет правильный заJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему я получаю ошибку Spring Boot (Java) Access-Control-Allow-Origin не может быть *, хотя он отправляет правильный за

Сообщение Anonymous »

У меня есть простое веб-приложение, содержащее интерфейс Angular и Spring Boot API, использующие аутентификацию Spring Security JWT (версия 3.0.5), развернутое в Tomcat 10. Веб-сервер и сервер APP/DB разделены. Я исключим этот домен из соображений конфиденциальности и заменю его на example.com.
У меня Cors настроен следующим образом:

Код: Выделить всё

CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Collections.singletonList("http://goods.example.com"));
configuration.setAllowedMethods(Arrays.asList("GET","POST", "PUT", "OPTIONS"));
configuration.setAllowCredentials(true);
configuration.setAllowedHeaders(Arrays.asList("Origin", "Access-Control-Allow-Origin", "Content-Type",
"Accept", "Jwt-Token", "Authorization", "X-Requested-With",
"Access-Control-Request-Method", "Access-Control-Request-Headers"));
configuration.setExposedHeaders(Arrays.asList("Origin", "Content-Type", "Accept", "Jwt-Token", "Authorization",
"Access-Control-Allow-Origin", "Access-Control-Allow-Origin", "Access-Control-Allow-Credentials", "Filename"));
configuration.setMaxAge(3600L);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
Моя конфигурация Spring Security следующая:

Код: Выделить всё

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.cors()
.configurationSource(corsConfigurationSource())
.and()
.csrf()
.disable()
//                .requiresChannel()
//                .anyRequest()
//                .requiresSecure()
//                .and()
.authorizeHttpRequests( authCustomizer -> authCustomizer
.requestMatchers(HttpMethod.POST, "/api/v1/auth/authenticate").permitAll()
.requestMatchers(HttpMethod.GET, "/api/v1/test").permitAll()
)
.authorizeHttpRequests()
.anyRequest()
.authenticated()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authenticationProvider(authenticationProvider)
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class)
.headers()
.xssProtection()
.and()
.contentSecurityPolicy("default-src 'self' data: blob:;");

return httpSecurity.build();
}
Как видите, сейчас я запускаю приложение по http.
Когда я вызываю конечную точку аутентификации с действительными учетными данными, она показывает следующие заголовки:

Код: Выделить всё

HTTP/1.1 403
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: http://goods.example.com
Access-Control-Expose-Headers: Origin, Content-Type, Accept, Jwt-Token, Authorization, Access-Control-Allow-Origin, Access-Control-Allow-Origin, Access-Control-Allow-Credentials, Filename
Access-Control-Allow-Credentials: true
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: application/json
Transfer-Encoding: chunked
Date: Wed, 03 May 2023 09:11:19 GMT
Keep-Alive: timeout=20
Connection: keep-alive
Теперь вот в чем проблема. В моих журналах я получаю следующую ошибку: c.o.g.Exception.DefaultExceptionHandler: java.lang.IllegalArgumentException: Когда параметрallowCredentials имеет значение true, AllowOrigins не может содержать специальное значение "*", поскольку оно не может быть установлено в "Access-Control-Allow-Origin" заголовок ответа. Чтобы разрешить учетные данные для набора источников, перечислите их явно или рассмотрите возможность использования вместо этого «allowedOriginPatterns».
На мой взгляд, я явно перечисляю разрешенные источники в моей конфигурации cors, но по какой-то причине это не работает...
Что я пробовал:
  • Я пробовал менять Коллекции. SingletonList() для Arrays.asList()
  • Удаление XSS и CSP
  • Изменение порядка аннотаций класса на: @Order(Ordered.HIGHEST_PRECEDENCE)< /li>
    Проверьте, есть ли активные правила cors в Tomcat (я не могу их найти)
  • Используйте setAllowedOriginPatterns ИЛИ addAllowedOriginPattern вместо setAllowOrigins
  • Добавьте аннотацию @Bean в мой CorsConfigurationSource
Это были исправления, которые я нашел в других темы/можно придумать самостоятельно.
Просто уточняю: у меня не возникает ошибка в браузере, только в Java/Tomcat. Вероятно, потому, что Spring Boot возвращает правильный заголовок...
Спасибо за помощь!

Подробнее здесь: https://stackoverflow.com/questions/761 ... in-cant-be
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»