Bu kılavuz, Cloud Firestore Security Rules uygulamanıza nasıl koşul ekleyeceğinizi göstermek için güvenlik kurallarını yapılandırma kılavuzunu temel alır. Cloud Firestore Security Rules ile ilgili temel bilgilere sahip değilseniz başlangıç kılavuzuna göz atın.
Cloud Firestore Security Rules aracının temel yapı taşı koşuldur. Koşul, belirli bir işleme izin verilip verilmeyeceğini belirleyen bir boole ifadesidir. Kullanıcı kimlik doğrulamasını kontrol eden, gelen verileri doğrulayan ve hatta veritabanınızın diğer bölümlerine erişen koşullar yazmak için güvenlik kurallarını kullanın.
Yapay Zeka Desteği için yapay zeka istemi
Yapay zeka desteği için aşağıdaki istemi yapay zeka kodlama temsilcinize (ör. Android Studio'da Gemini, Antigravity, Claude Code, Codex ve Cursor) kopyalayın. İstemi özelleştirebilir ve temsilcinizle birlikte üzerinde çalışabilirsiniz. Ayrıntılı kurulum bilgileri için Firebase aracı becerileri sayfasını ziyaret edin.
Help me use Firebase in my app.
1. Make sure that **Firebase agent skills** are installed and updated. For Claude Code, Codex, or Cursor agents, help me install the Firebase plugin. For other agents, run `npx skills add firebase/agent-skills`. Always try to use **Firebase agent skills** for Firebase-related tasks.
2. Help me write, validate, and deploy Firebase Security Rules to protect my app's Firestore data.
Doğrulama
En yaygın güvenlik kuralı kalıplarından biri, erişimi kullanıcının kimlik doğrulama durumuna göre kontrol etmektir. Örneğin, uygulamanız yalnızca oturum açmış kullanıcıların veri yazmasına izin vermek isteyebilir:
service cloud.firestore { match /databases/{database}/documents { // Allow the user to access documents in the "cities" collection // only if they are authenticated. match /cities/{city} { allow read, write: if request.auth != null; } } }
Sık kullanılan bir diğer kalıp da kullanıcıların yalnızca kendi verilerini okuyup yazabilmesini sağlamaktır:
service cloud.firestore { match /databases/{database}/documents { // Make sure the uid of the requesting user matches name of the user // document. The wildcard expression {userId} makes the userId variable // available in rules. match /users/{userId} { allow read, update, delete: if request.auth != null && request.auth.uid == userId; allow create: if request.auth != null; } } }
Uygulamanız Firebase Authentication veya Google Cloud Identity Platform kullanıyorsa request.auth değişkeni, veri isteyen istemcinin kimlik doğrulama bilgilerini içerir.
request.auth hakkında daha fazla bilgi için referans dokümanlarını inceleyin.
Veri doğrulama
Birçok uygulama, erişim denetimi bilgilerini veritabanındaki belgelerde alan olarak depolar. Cloud Firestore Security Rules, doküman verilerine göre erişime dinamik olarak izin verebilir veya erişimi reddedebilir:
service cloud.firestore { match /databases/{database}/documents { // Allow the user to read data if the document has the 'visibility' // field set to 'public' match /cities/{city} { allow read: if resource.data.visibility == 'public'; } } }
resource değişkeni istenen dokümanı, resource.data ise dokümanda depolanan tüm alanların ve değerlerin haritasını ifade eder. resource değişkeni hakkında daha fazla bilgi için referans dokümanlarına bakın.
Veri yazarken gelen verileri mevcut verilerle karşılaştırmak isteyebilirsiniz.
Bu durumda, kural grubunuz bekleyen yazma işlemine izin veriyorsa request.resource
değişkeni, dokümanın gelecekteki durumunu içerir. Yalnızca doküman alanlarının bir alt kümesini değiştiren update işlemleri için request.resource değişkeni, işlemden sonra bekleyen doküman durumunu içerir. İstenmeyen veya tutarsız veri güncellemelerini önlemek için request.resource alan değerlerini kontrol edebilirsiniz:
service cloud.firestore { match /databases/{database}/documents { // Make sure all cities have a positive population and // the name is not changed match /cities/{city} { allow update: if request.resource.data.population > 0 && request.resource.data.name == resource.data.name; } } }
Diğer belgelere erişme
Güvenlik kurallarınız, get() ve exists() işlevlerini kullanarak gelen istekleri veritabanındaki diğer dokümanlara göre değerlendirebilir. get() ve exists() işlevleri, tam olarak belirtilmiş doküman yolları gerektirir. get() ve exists() için yol oluşturmak üzere değişkenleri kullanırken $(variable) söz dizimini kullanarak değişkenleri açıkça kodlamanız gerekir.
Aşağıdaki örnekte, database değişkeni match /databases/{database}/documents eşleşme ifadesi tarafından yakalanır ve yolu oluşturmak için kullanılır:
service cloud.firestore { match /databases/{database}/documents { match /cities/{city} { // Make sure a 'users' document exists for the requesting user before // allowing any writes to the 'cities' collection allow create: if request.auth != null && exists(/databases/$(database)/documents/users/$(request.auth.uid)); // Allow the user to delete cities if their user document has the // 'admin' field set to 'true' allow delete: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true; } } }
Yazma işlemleri için bir işlemin veya yazma grubunun tamamlanmasından sonra ancak işlem ya da grup kaydedilmeden önce bir belgenin durumuna erişmek için getAfter() işlevini kullanabilirsiniz. get() gibi getAfter() işlevi de tam olarak belirtilmiş bir doküman yolu alır. getAfter() kullanarak, bir işlem veya toplu işlem olarak birlikte gerçekleşmesi gereken yazma grupları tanımlayabilirsiniz.
Erişim çağrısı sınırları
Kural kümesi değerlendirmesi başına doküman erişim çağrısı sınırı vardır:
- Tek belgeli istekler ve sorgu istekleri için 10.
-
Çoklu belge okuma, işlemler ve toplu yazma işlemleri için 20. Önceki 10 sınırı her işlem için de geçerlidir.
Örneğin, 3 yazma işlemi içeren bir toplu yazma isteği oluşturduğunuzu ve güvenlik kurallarınızın her yazma işlemini doğrulamak için 2 belge erişim çağrısı kullandığını varsayalım. Bu durumda, her yazma işlemi 10 erişim çağrısından 2'sini, toplu yazma isteği ise 20 erişim çağrısından 6'sını kullanır.
Her iki sınırın da aşılması, "izin verilmedi" hatasıyla sonuçlanır. Bazı doküman erişim çağrıları önbelleğe alınabilir ve önbelleğe alınan çağrılar sınırlara dahil edilmez.
Bu sınırların işlemleri ve toplu yazma işlemlerini nasıl etkilediğiyle ilgili ayrıntılı açıklama için atomik işlemleri güvenli hale getirme kılavuzuna bakın.
Erişim aramaları ve fiyatlandırma
Bu işlevlerin kullanılması, veritabanınızda bir okuma işlemi yürütür. Bu da kurallarınız isteği reddetse bile dokümanları okuma için faturalandırılacağınız anlamına gelir. Daha ayrıntılı fatura bilgileri için Kuralların Fiyatlandırması bölümüne bakın.
Özel işlevler
Güvenlik kurallarınız daha karmaşık hale geldikçe koşul gruplarını kural grubunuzda yeniden kullanabileceğiniz işlevlere sarmak isteyebilirsiniz. Güvenlik kuralları, özel işlevleri destekler. Özel işlevlerin söz dizimi JavaScript'e benzer ancak güvenlik kuralları işlevleri, bazı önemli sınırlamaları olan alana özgü bir dilde yazılır:
- İşlevler yalnızca tek bir
returnifadesi içerebilir. Başka bir mantık içeremezler. Örneğin, döngüleri yürütemez veya harici hizmetleri çağıramazlar. - İşlevler, tanımlandıkları kapsamdaki işlevlere ve değişkenlere otomatik olarak erişebilir. Örneğin,
service cloud.firestorekapsamında tanımlanan bir işlev,resourcedeğişkenine veget()ileexists()gibi yerleşik işlevlere erişebilir. - İşlevler diğer işlevleri çağırabilir ancak yineleme yapamaz. Toplam çağrı yığını derinliği 10 ile sınırlıdır.
v2kural sürümünde işlevler,letanahtar kelimesini kullanarak değişkenleri tanımlayabilir. İşlevlerde en fazla 10 let bağlaması olabilir ancak işlevler bir dönüş ifadesiyle bitmelidir.
İşlevler function anahtar kelimesiyle tanımlanır ve sıfır veya daha fazla bağımsız değişken alır. Örneğin, yukarıdaki örneklerde kullanılan iki koşul türünü tek bir işlevde birleştirmek isteyebilirsiniz:
service cloud.firestore { match /databases/{database}/documents { // True if the user is signed in or the requested data is 'public' function signedInOrPublic() { return request.auth.uid != null || resource.data.visibility == 'public'; } match /cities/{city} { allow read, write: if signedInOrPublic(); } match /users/{user} { allow read, write: if signedInOrPublic(); } } }
Güvenlik kurallarınızda işlevleri kullanmak, kurallarınızın karmaşıklığı arttıkça kuralların daha kolay yönetilmesini sağlar.
Kurallar filtre değildir
Verilerinizin güvenliğini sağlayıp sorgu yazmaya başladığınızda güvenlik kurallarının filtre olmadığını unutmayın. Bir koleksiyondaki tüm dokümanlar için sorgu yazıp kuralların yalnızca mevcut istemcinin erişim izni olan dokümanları döndürmesini bekleyemezsiniz.
Örneğin, aşağıdaki güvenlik kuralını ele alalım:
service cloud.firestore {
match /databases/{database}/documents {
// Allow the user to read data if the document has the 'visibility'
// field set to 'public'
match /cities/{city} {
allow read: if resource.data.visibility == 'public';
}
}
}
Reddedildi: Bu kural, sonuç kümesi visibility değerinin public olmadığı dokümanlar içerebileceğinden aşağıdaki sorguyu reddeder:
Web
db.collection("cities").get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, " => ", doc.data());
});
});İzin verilir: where("visibility", "==", "public") ifadesi, sonuç kümesinin kuralın koşulunu karşılamasını garanti ettiğinden bu kural aşağıdaki sorguya izin verir:
Web
db.collection("cities").where("visibility", "==", "public").get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, " => ", doc.data());
});
});Kurallar güvenlik kuralları, her sorguyu olası sonucuna göre değerlendirir ve istemcinin okuma izni olmayan bir belge döndürebilecekse isteği başarısız kılar. Sorgular, güvenlik kurallarınız tarafından belirlenen kısıtlamalara uymalıdır. Güvenlik kuralları ve sorgular hakkında daha fazla bilgi için Verileri güvenli bir şekilde sorgulama başlıklı makaleyi inceleyin.
Sonraki adımlar
- Güvenlik kurallarının sorgularınızı nasıl etkilediğini öğrenin.
- Güvenlik kurallarını nasıl yapılandıracağınızı öğrenin.
- Güvenlik kuralları referansını okuyun.
- Cloud Storage for Firebase kullanan uygulamalarınızda Cloud Firestore belgelerine erişen koşullarını Cloud Storage Security Rules nasıl yazacağınızı öğrenin.