Ошибка Spring Cloud Gateway и Keycloak CORS при использовании oauth2-resource-server ⇐ JAVA
-
Anonymous
Ошибка Spring Cloud Gateway и Keycloak CORS при использовании oauth2-resource-server
Я использую Spring Boot 3.0.2 и Spring Cloud Gateway. Кроме того, я использую Spring-boot-starter-oauth2-resource-server для получения и проверки токена jwt на сервере Keycloak на предмет безопасности. мой файл build.gradle выглядит так:
плагины { идентификатор 'Java' идентификатор 'org.springframework.boot' версии '3.0.2' идентификатор 'io.spring.dependent-management' версии '1.1.3' } зависимости { реализация 'org.springframework.cloud:spring-cloud-starter' реализация 'org.springframework.boot:spring-boot-starter-webflux' реализация 'org.springframework.cloud:spring-cloud-starter-gateway' реализация 'org.springframework.boot:spring-boot-starter-data-jpa' реализация 'org.springframework.boot:spring-boot-starter-data-mongodb' реализация 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' реализация 'org.springframework.boot:spring-boot-starter-actuator' реализация 'com.shahrtech.service.libs:service-common-libs:0.0.61' реализация 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j' реализация 'org.springframework.cloud:spring-cloud-starter-loadbalancer' } и файл конфигурации в application.yml:
весна: облако: шлюз: фильтры по умолчанию: - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow- Origin Глобалкорс: CorsКонфигурации: '[/**]': разрешеноOrigins: "*" разрешенные методы: "*" разрешенные заголовки: "*" маршруты: - id: служба аутентификации ури: http://x.x.x.x:8085/ предикаты: - Путь=/auth-service/v1.0/** фильтры: - RewritePath=/auth-service/v1.0/(?.*),/auth-service/v1.0/$\{path} - RequestHashing=SHA-256 #----------- simcard-charge-service ----------- - идентификатор: служба поддержки клиентов ури: http://x.x.x.x:8090/ предикаты: - Путь=/клиент-сервис/v1.0/** фильтры: - RewritePath=/customer-service/v1.0/(?.*),/customer-service/v1.0/$\{path} - RequestHashing=SHA-256 безопасность: оаут2: клиент: Регистрация: плащ-ключ: идентификатор клиента: приложение для входа тип разрешения-авторизации: код_авторизации область действия: openid поставщик: плащ-ключ: эмитент-uri: http://x.x.x.x:9002/auth/realms/app атрибут имени пользователя: предпочтительное_имя_пользователя сервер ресурсов: просто: эмитент-uri: http://x.x.x.x:9002/auth/realms/app и ApiGatewayServiceApplication.java:
@SpringBootApplication @EnableDiscoveryClient @EnableWebFluxSecurity @EnableReactiveMethodSecurity общественный класс ApiGatewayServiceApplication { @Бин public SecurityWebFilterChain SecurityWebFilterChain (ServerHttpSecurity http) { http.cors().and().csrf() .csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse()) .и() .authorizeExchange() .anyExchange().аутентифицированный() .и() .oauth2ResourceServer() .jwt(); вернуть http.build(); } @Бин CorsConfigurationSource corsConfiguration() { CorsConfiguration corsConfig = новый CorsConfiguration (); corsConfig.applyPermitDefaultValues(); corsConfig.addAllowedMethod(HttpMethod.PUT); corsConfig.addAllowedMethod(HttpMethod.DELETE); corsConfig.setAllowedOrigins(Arrays.asList("*", "**")); corsConfig.setAllowCredentials(истина); Источник UrlBasedCorsConfigurationSource = новый UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", corsConfig); источник возврата; } public static void main(String[] args) { SpringApplication.run(ApiGatewayServiceApplication.class, args); }
Я также использую этот компонент для изменения конфигурации безопасности:
@Бин public SecurityFilterChain filterChain(HttpSecurity http) выдает исключение { http .authorizeRequests() .requestMatchers(new AntPathRequestMatcher("/auth-service/**")).permitAll() // Загрузка данных /auth-service/** и /swagger-ui/** .anyRequest().permitAll() .и() .httpBasic() .и() .csrf().отключить() .cors().отключить(); вернуть http.build(); } Все в порядке. Но когда веб-приложение, созданное ReactJs, получает ошибку CORS (ошибка CORS No 'Access-Control-Allow-Origin). И любое решение в Интернете не работает
Я использую Spring Boot 3.0.2 и Spring Cloud Gateway. Кроме того, я использую Spring-boot-starter-oauth2-resource-server для получения и проверки токена jwt на сервере Keycloak на предмет безопасности. мой файл build.gradle выглядит так:
плагины { идентификатор 'Java' идентификатор 'org.springframework.boot' версии '3.0.2' идентификатор 'io.spring.dependent-management' версии '1.1.3' } зависимости { реализация 'org.springframework.cloud:spring-cloud-starter' реализация 'org.springframework.boot:spring-boot-starter-webflux' реализация 'org.springframework.cloud:spring-cloud-starter-gateway' реализация 'org.springframework.boot:spring-boot-starter-data-jpa' реализация 'org.springframework.boot:spring-boot-starter-data-mongodb' реализация 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' реализация 'org.springframework.boot:spring-boot-starter-actuator' реализация 'com.shahrtech.service.libs:service-common-libs:0.0.61' реализация 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j' реализация 'org.springframework.cloud:spring-cloud-starter-loadbalancer' } и файл конфигурации в application.yml:
весна: облако: шлюз: фильтры по умолчанию: - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow- Origin Глобалкорс: CorsКонфигурации: '[/**]': разрешеноOrigins: "*" разрешенные методы: "*" разрешенные заголовки: "*" маршруты: - id: служба аутентификации ури: http://x.x.x.x:8085/ предикаты: - Путь=/auth-service/v1.0/** фильтры: - RewritePath=/auth-service/v1.0/(?.*),/auth-service/v1.0/$\{path} - RequestHashing=SHA-256 #----------- simcard-charge-service ----------- - идентификатор: служба поддержки клиентов ури: http://x.x.x.x:8090/ предикаты: - Путь=/клиент-сервис/v1.0/** фильтры: - RewritePath=/customer-service/v1.0/(?.*),/customer-service/v1.0/$\{path} - RequestHashing=SHA-256 безопасность: оаут2: клиент: Регистрация: плащ-ключ: идентификатор клиента: приложение для входа тип разрешения-авторизации: код_авторизации область действия: openid поставщик: плащ-ключ: эмитент-uri: http://x.x.x.x:9002/auth/realms/app атрибут имени пользователя: предпочтительное_имя_пользователя сервер ресурсов: просто: эмитент-uri: http://x.x.x.x:9002/auth/realms/app и ApiGatewayServiceApplication.java:
@SpringBootApplication @EnableDiscoveryClient @EnableWebFluxSecurity @EnableReactiveMethodSecurity общественный класс ApiGatewayServiceApplication { @Бин public SecurityWebFilterChain SecurityWebFilterChain (ServerHttpSecurity http) { http.cors().and().csrf() .csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse()) .и() .authorizeExchange() .anyExchange().аутентифицированный() .и() .oauth2ResourceServer() .jwt(); вернуть http.build(); } @Бин CorsConfigurationSource corsConfiguration() { CorsConfiguration corsConfig = новый CorsConfiguration (); corsConfig.applyPermitDefaultValues(); corsConfig.addAllowedMethod(HttpMethod.PUT); corsConfig.addAllowedMethod(HttpMethod.DELETE); corsConfig.setAllowedOrigins(Arrays.asList("*", "**")); corsConfig.setAllowCredentials(истина); Источник UrlBasedCorsConfigurationSource = новый UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", corsConfig); источник возврата; } public static void main(String[] args) { SpringApplication.run(ApiGatewayServiceApplication.class, args); }
Я также использую этот компонент для изменения конфигурации безопасности:
@Бин public SecurityFilterChain filterChain(HttpSecurity http) выдает исключение { http .authorizeRequests() .requestMatchers(new AntPathRequestMatcher("/auth-service/**")).permitAll() // Загрузка данных /auth-service/** и /swagger-ui/** .anyRequest().permitAll() .и() .httpBasic() .и() .csrf().отключить() .cors().отключить(); вернуть http.build(); } Все в порядке. Но когда веб-приложение, созданное ReactJs, получает ошибку CORS (ошибка CORS No 'Access-Control-Allow-Origin). И любое решение в Интернете не работает
Мобильная версия