Я наблюдаю различное поведение локально и . в облаке, и я не могу понять, почему.
Что происходит:
- Локально: когда я тестирую Spring Boot API с моим приложением Angular, используя
прокси (proxy.dev.conf.json или proxy.prod.conf.json). ), все работает
отлично. Однако конечная точка /public/cars доступна из любого
источника, даже если я установил определенные разрешенные источники в Spring
Security. - Развертывание Cloud Run. Когда я развертываю приложение Angular и API,
Потому что оно пытается получить доступ к маршруту Angular вместо связи с API! Однако, если я получаю доступ к API напрямую из браузера
(без использования Angular), я все равно могу попасть в конечную точку /public/cars
и получить данные, даже если источник должен быть заблокирован.
Код: Выделить всё
@Configuration
@EnableWebSecurity
@Slf4j
public class SecurityConfig {
@Value("${allowed.origins}")
private String allowedOrigins;
@Bean
public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {
http.csrf(AbstractHttpConfigurer::disable)
.cors(httpSecurityCorsConfigurer -> httpSecurityCorsConfigurer.configurationSource(corsConfigurationSource()))
.authorizeHttpRequests(
authorize -> authorize
.requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/swagger-ui.html").permitAll()
.requestMatchers("/public","/public/**").permitAll() // Public endpoints
.anyRequest().authenticated()
)
.sessionManagement(sessionManagement -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
return http.build();
}
@Bean
CorsConfigurationSource corsConfigurationSource() {
log.info("allowed origins : {}", allowedOrigins);
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(List.of(allowedOrigins));
configuration.setAllowedHeaders(List.of("X-API-KEY", "Content-Type", "Authorization", "Cache-Control"));
configuration.setExposedHeaders(List.of("X-Rate-Limit-Remaining", "X-Rate-Limit-Retry-After-Seconds", "Cache-Control", "Content-Type", "Access-Control-Expose-Headers", "Access-Control-Allow-Origin"));
configuration.setAllowedMethods(List.of("GET", "POST", "DELETE", "PUT"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
Код: Выделить всё
// proxy.dev.conf.json:
{
"/api": {
"target": "https://api.testcars.com",
"secure": false,
"changeOrigin": false,
"pathRewrite": {
"^/api": ""
}
}
}
- Локально< /strong>: я могу получить доступ к /public/cars из любого источника, даже если я
указал разрешенные источники в Spring Security. - Cloud Run (развернуто):
Приложение Angular: Приложение не может обмениваться данными с API из-за
ошибок CORS.
Прямой доступ к API (через браузер): я могу перейти к развернутому API
и получайте ответы от /public/cars без проблем с CORS, даже если
источник запрещен.
- Почему я могу получить доступ к /public/cars из любого источника локально, хотя
Я установил разрешенные источники в Spring Security? - Почему мое приложение Angular не может взаимодействовать с API, когда оба
развернуты в Cloud Run? - Почему я могу напрямую получить доступ к API из браузера а не
через приложение Angular?
Подробнее здесь: https://stackoverflow.com/questions/790 ... my-angular