- Konu sahibi
- #1
Spring Boot'ta CORS, tarayıcıdaki başka bir origin'den API yanıtına erişimin hangi koşullarda kabul edileceğini belirler. Spring Web MVC uygulamasında merkezi kurallar için
Aşağıdaki geliştirme örneği,
Bu örnek bir API uç noktası oluşturmaz; eşleşen mevcut controller'ların CORS kuralını tanımlar. WebFlux kullanan reaktif uygulamada MVC yapılandırıcısı kullanılmaz. Üretimde localhost yerine gerçek istemci origin'ini açıkça yazın.
Preflight çoğu zaman oturum çerezi taşımadığından CORS, güvenlik denetiminden önce işlenmelidir. MVC mevcutsa ve ayrı bir
Mevcut
Birden fazla güvenlik zinciri veya özel CORS kaynağı varsa eşleşen zincirin kullandığı kuralları ayrıca kontrol edin. Sorunu çözmek için tüm istekleri herkese açmayın veya CSRF korumasını gelişigüzel kapatmayın.
Uygulamanızdaki gerçek bir yol için örnek ön istek:
Windows PowerShell'de curl başka bir komuta takma adsa kurulu gerçek istemciyi
Yanıtta beklenen CORS başlıkları yoksa sırayla URL eşleşmesini, origin yazımını, bileşen taramasını ve Security zincirini inceleyin. curl yanıtı gösterebilir; tarayıcı gibi CORS engellemesi uygulamaz.
WebMvcConfigurer kullanılabilir. CORS, API'nin kimlik doğrulamasının veya yetkilendirmesinin yerine geçmez.MVC için merkezi yapılandırma
Aşağıdaki geliştirme örneği,
http://localhost:3000 origin'inden gelen /api/** istekleri içindir. Origin; protokol, ana makine adı ve porttan oluşur, sonuna sayfa yolu eklenmez. Dosyayı CorsConfig.java adıyla uygulamanın bileşen taramasına giren pakete koyun. Örneğin ana uygulama sınıfı com.example.demo paketindeyse bu paket veya altı uygundur.
Kod:
package com.example.demo;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("Content-Type", "Authorization")
.allowCredentials(false)
.maxAge(3600);
}
}
Bu örnek bir API uç noktası oluşturmaz; eşleşen mevcut controller'ların CORS kuralını tanımlar. WebFlux kullanan reaktif uygulamada MVC yapılandırıcısı kullanılmaz. Üretimde localhost yerine gerçek istemci origin'ini açıkça yazın.
Ayarları ihtiyaca göre daraltma
| Ayar | Örnekteki kapsam | Ne zaman değişir? |
|---|---|---|
| Yol | /api/** | Yalnız dış istemciye açılan API yolları için |
| Origin | http://localhost:3000 | İstemcinin protokolü, alan adı veya portu değişirse |
| Metot/başlık | GET, POST, PUT, DELETE; Content-Type, Authorization | Gerçek istemci isteğinin gereksinimine göre |
| Kimlik bilgisi | allowCredentials(false) | Tarayıcının çerez gibi kimlik bilgilerini taşıması gerekiyorsa güvenlik değerlendirmesiyle |
allowedMethods, preflight isteğinin Access-Control-Request-Method başlığında sorduğu gerçek metotları sınırlar. Listeye yalnız OPTIONS eklemek, POST isteğini veya güvenlik filtrelerinin preflight'ı kabul etmesini sağlamaz. Spring, uygun CORS yapılandırmasında preflight yanıtını işler.allowCredentials(true) gerekiyorsa allowedOrigins("*") kullanmayın; güvenilen origin'leri açıkça belirtin. Authorization başlığını elle göndermek ile tarayıcının credential modu aynı ayar değildir. Bu başlığın ön istekte izin verilen başlıklardan olması ve sunucunun token'ı ayrıca doğrulaması gerekir.Spring Security ile birlikte kullanma
Preflight çoğu zaman oturum çerezi taşımadığından CORS, güvenlik denetiminden önce işlenmelidir. MVC mevcutsa ve ayrı bir
CorsConfigurationSource tanımlamıyorsanız Security, MVC CORS kurallarını kullanabilir.Mevcut
SecurityFilterChain oluşturduğunuz metotta, kendi yetkilendirme ve CSRF kurallarınızı koruyarak CORS'u etkinleştirin. Aşağıdaki bir entegrasyon parçasıdır, tek başına tam sınıf değildir:
Kod:
import static org.springframework.security.config.Customizer.withDefaults;
// Mevcut HttpSecurity yapılandırmanız içinde:
http.cors(withDefaults());
Birden fazla güvenlik zinciri veya özel CORS kaynağı varsa eşleşen zincirin kullandığı kuralları ayrıca kontrol edin. Sorunu çözmek için tüm istekleri herkese açmayın veya CSRF korumasını gelişigüzel kapatmayın.
Ön isteği ve gerçek isteği ayrı doğrulama
Uygulamanızdaki gerçek bir yol için örnek ön istek:
Kod:
curl -i -X OPTIONS http://localhost:8080/api/users -H "Origin: http://localhost:3000" -H "Access-Control-Request-Method: POST" -H "Access-Control-Request-Headers: content-type,authorization"
Windows PowerShell'de curl başka bir komuta takma adsa kurulu gerçek istemciyi
curl.exe ile çağırın. İzin verilen origin, metot ve başlıkların yanıtla karşılandığını inceleyin. Ardından aynı origin'den tarayıcıyla gerçek isteği deneyin. Bu komut örnektir; burada çalışan bir uç nokta veya ölçülmüş başarı iddiası yoktur.Yanıtta beklenen CORS başlıkları yoksa sırayla URL eşleşmesini, origin yazımını, bileşen taramasını ve Security zincirini inceleyin. curl yanıtı gösterebilir; tarayıcı gibi CORS engellemesi uygulamaz.
Sık sorulan sorular
Son düzenleme: