Cloud Firestore Güvenlik Kuralları, veritabanınızdaki belge ve koleksiyonlara erişimi kontrol etmenize olanak tanır. Esnek kural söz dizimi, tüm yazma işlemlerinden veritabanının tamamına, belirli bir belgedeki işlemlere kadar her şeyle eşleşen kurallar oluşturmanıza olanak tanır.
Bu kılavuzda, güvenlik kurallarının temel söz dizimi ve yapısı açıklanmaktadır. Eksiksiz kural kümeleri oluşturmak için bu söz dizimini güvenlik kuralı koşullarıyla birleştirin.
Hizmet ve veritabanı beyanı
Cloud Firestore Güvenlik Kuralları her zaman aşağıdaki bildirimle başlar:
service cloud.firestore {
match /databases/{database}/documents {
// ...
}
}
service cloud.firestore
bildirimi, kuralları Cloud Firestore'a dahil ederek Cloud Firestore Güvenlik Kuralları ile Cloud Storage gibi diğer ürünlerin kuralları arasındaki çakışmaları önler.
match /databases/{database}/documents
bildirimi, kuralların projedeki tüm Cloud Firestore veritabanlarıyla eşleşmesi gerektiğini belirtir. Şu anda her projede (default)
adında yalnızca tek bir veritabanı vardır.
Temel okuma/yazma kuralları
Temel kurallar, bir belge yolunu belirten match
ifadesinden ve belirtilen verilerin okunduğunda ayrıntı veren bir allow
ifadesinden oluşur:
service cloud.firestore {
match /databases/{database}/documents {
// Match any document in the 'cities' collection
match /cities/{city} {
allow read: if <condition>;
allow write: if <condition>;
}
}
}
Tüm eşleşme ifadeleri koleksiyonları değil, dokümanları işaret etmelidir. Eşleşme ifadesi, match /cities/SF
ürününde olduğu gibi belirli bir dokümanı işaret edebilir veya match /cities/{city}
ürününde olduğu gibi, belirtilen yoldaki herhangi bir dokümana işaret etmek için joker karakterler kullanabilir.
Yukarıdaki örnekte, eşleşme ifadesinde {city}
joker karakter söz dizimi kullanılır.
Bu, kuralın cities
koleksiyonundaki tüm dokümanlar (ör. /cities/SF
veya /cities/NYC
) için geçerli olduğu anlamına gelir. Eşleşme ifadesindeki allow
ifadeleri değerlendirildiğinde, city
değişkeni şehir belgesi adına çözümlenir (ör. SF
veya NYC
).
Ayrıntılı işlemler
Bazı durumlarda read
ve write
işlevlerinin daha ayrıntılı işlemlere ayrılması yararlı olur. Örneğin, uygulamanız doküman oluşturma için doküman silmeye kıyasla farklı koşullar uygulamak isteyebilir. Tek belge okumalarına izin verip büyük sorguları reddetmek isteyebilirsiniz.
read
kuralı get
ve list
, write
kuralı ise create
, update
ve delete
değerlerine ayrılabilir:
service cloud.firestore {
match /databases/{database}/documents {
// A read rule can be divided into get and list rules
match /cities/{city} {
// Applies to single document read requests
allow get: if <condition>;
// Applies to queries and collection read requests
allow list: if <condition>;
}
// A write rule can be divided into create, update, and delete rules
match /cities/{city} {
// Applies to writes to nonexistent documents
allow create: if <condition>;
// Applies to writes to existing documents
allow update: if <condition>;
// Applies to delete operations
allow delete: if <condition>;
}
}
}
Hiyerarşik veriler
Cloud Firestore'daki veriler, belge koleksiyonları halinde düzenlenir. Her belge, hiyerarşiyi alt koleksiyonlar aracılığıyla genişletebilir. Güvenlik kurallarının hiyerarşik verilerle nasıl etkileşime girdiğini anlamak önemlidir.
cities
koleksiyonundaki her belgenin landmarks
alt koleksiyon içerdiğini göz önünde bulundurun. Güvenlik kuralları yalnızca eşleşen yolda uygulanır. Bu nedenle, cities
koleksiyonunda tanımlanan erişim denetimleri landmarks
alt koleksiyonu için geçerli değildir. Bunun yerine, alt koleksiyonlara erişimi kontrol etmek için
açık kurallar yazın:
service cloud.firestore {
match /databases/{database}/documents {
match /cities/{city} {
allow read, write: if <condition>;
// Explicitly define rules for the 'landmarks' subcollection
match /landmarks/{landmark} {
allow read, write: if <condition>;
}
}
}
}
match
ifadelerini iç içe yerleştirirken iç match
ifadesinin yolu her zaman dış match
ifadesinin yoluna göre olur. Bu nedenle aşağıdaki kural kümeleri eşdeğerdir:
service cloud.firestore {
match /databases/{database}/documents {
match /cities/{city} {
match /landmarks/{landmark} {
allow read, write: if <condition>;
}
}
}
}
service cloud.firestore {
match /databases/{database}/documents {
match /cities/{city}/landmarks/{landmark} {
allow read, write: if <condition>;
}
}
}
Yinelemeli joker karakterler
Kuralların rastgele derin hiyerarşiye uygulanmasını istiyorsanız {name=**}
olan yinelemeli joker karakter söz dizimini kullanın. Örnek:
service cloud.firestore {
match /databases/{database}/documents {
// Matches any document in the cities collection as well as any document
// in a subcollection.
match /cities/{document=**} {
allow read, write: if <condition>;
}
}
}
Yinelemeli joker karakter söz dizimini kullanırken, doküman derin şekilde iç içe yerleştirilmiş bir alt koleksiyonda bulunsa bile joker karakter değişkeni, eşleşen yol segmentinin tamamını içerir. Örneğin, yukarıda listelenen kurallar /cities/SF/landmarks/coit_tower
adresinde bulunan bir dokümanla eşleşir ve document
değişkeninin değeri SF/landmarks/coit_tower
olur.
Bununla birlikte, yinelemeli joker karakterlerin davranışının, kural sürümüne bağlı olduğunu unutmayın.
Sürüm 1
Güvenlik kuralları varsayılan olarak sürüm 1'i kullanır. Sürüm 1'de, yinelemeli joker karakterler bir veya daha fazla yol öğesiyle eşleşir. Boş bir yolla eşleşmezler. Bu nedenle match /cities/{city}/{document=**}
, alt koleksiyonlardaki dokümanları eşleştirir ancak cities
koleksiyonuyla eşleşmez. match /cities/{document=**}
ise cities
koleksiyonundaki ve alt koleksiyonlardaki her iki dokümanla da eşleşir.
Yinelemeli joker karakterler, eşleşme ifadesinin sonuna gelmelidir.
Sürüm 2
Güvenlik kurallarının 2. sürümünde, yinelemeli joker karakterler sıfır veya daha fazla yol öğesiyle eşleşir. match/cities/{city}/{document=**}
, tüm alt koleksiyonlardaki dokümanların yanı sıra cities
koleksiyonundaki dokümanlarla eşleşir.
Güvenlik kurallarınızın üst kısmına rules_version = '2';
ekleyerek sürüm 2'ye dahil olmanız gerekir:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Matches any document in the cities collection as well as any document
// in a subcollection.
match /cities/{city}/{document=**} {
allow read, write: if <condition>;
}
}
}
Eşleşme ifadesi başına en fazla bir yinelemeli joker karakteriniz olabilir. Ancak sürüm 2'de bu joker karakteri, eşleşme ifadesinde herhangi bir yere yerleştirebilirsiniz. Örnek:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Matches any document in the songs collection group
match /{path=**}/songs/{song} {
allow read, write: if <condition>;
}
}
}
Koleksiyon grubu sorgularını kullanıyorsanız sürüm 2'yi kullanmanız gerekir. Koleksiyon grubu sorgularını güvenli hale getirme bölümünü inceleyin.
Çakışan eşleşme ifadeleri
Bir doküman birden fazla match
ifadesiyle eşleşebilir. Birden fazla allow
ifadesinin bir istekle eşleştiği durumlarda, koşullardan herhangi birinin true
olması durumunda erişime izin verilir:
service cloud.firestore {
match /databases/{database}/documents {
// Matches any document in the 'cities' collection.
match /cities/{city} {
allow read, write: if false;
}
// Matches any document in the 'cities' collection or subcollections.
match /cities/{document=**} {
allow read, write: if true;
}
}
}
Yukarıdaki örnekte, ilk kural her zaman false
olsa da ikinci kural her zaman true
olduğundan cities
koleksiyonundaki tüm okuma ve yazma işlemlerine izin verilir.
Güvenlik kuralı sınırları
Güvenlik kurallarıyla çalışırken aşağıdaki sınırlara dikkat edin:
Sınır | Ayrıntılar |
---|---|
İstek başına maksimum exists() , get() ve getAfter() çağrısı sayısı |
Her iki sınırın da aşılması, "izin verilmedi" hatasıyla sonuçlanır. Bazı belge erişimi çağrıları önbelleğe alınabilir. Önbelleğe alınan çağrılar sınırlamaya dahil edilmez. |
Maksimum iç içe yerleştirilen match ifadesi derinliği |
10 |
Yol segmentlerinde, iç içe yerleştirilmiş bir grup match ifadesinde izin verilen maksimum yol uzunluğu |
100 |
İç içe yerleştirilen bir grup match ifadesinde izin verilen maksimum yol yakalama değişkeni sayısı |
20 |
Maksimum işlev çağrısı derinliği | 20 |
Maksimum işlev bağımsız değişkeni sayısı | 7 |
İşlev başına maksimum let işlev bağlama sayısı |
10 |
Maksimum yinelenen veya döngüsel işlev çağrısı sayısı | 0 (izin verilmez) |
İstek başına değerlendirilen maksimum ifade sayısı | 1.000 |
Maksimum kural grubu boyutu | Kural kümeleri iki boyut sınırına uymalıdır:
|
Sonraki adımlar
- Özel güvenlik kuralı koşullarını yazın.
- Güvenlik kuralları referansını okuyun.