Bu kılavuz, güvenlik kurallarını yapılandırma kılavuzu üzerine inşa edilmiştir başlıklı makalemize göz atın. Uygun değilseniz Cloud Firestore Güvenlik Kurallarının temellerine aşinaysanız başlangıç sayfasına bakın rehberini inceleyin.
Cloud Firestore Güvenlik Kurallarının birincil yapı taşı koşuldur. CEVAP koşul, belirli bir işlemin gerçekleşip gerçekleşmeyeceğini belirleyen izin verilen veya reddedilmelidir. Veri güvenliği kurallarından faydalanarak kullanıcı kimlik doğrulamasını kontrol edebilir, gelen verileri doğrulayabilir ve hatta yardımcı olur.
Doğrulama
En yaygın güvenlik kuralı modellerinden biri, kullanıcının kimlik doğrulama durumuna Örneğin, uygulamanız oturum açmış kullanıcıların veri yazmasını sağlayın:
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;
}
}
}
Yaygın olarak kullanılan diğer bir model de kullanıcıların yalnızca kendi telefonlarını okuyup yazabildiğinden emin olmaktır. veri:
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 bilgileri.
request.auth
hakkında daha fazla bilgi edinmek için referansa bakın
dokümanlarına göz atın.
Veri doğrulama
Birçok uygulama, erişim denetimi bilgilerini veritabanındaki dokümanlarda alanlar olarak depolar. Cloud Firestore Güvenlik Kuralları, belgeye göre erişime dinamik olarak izin verebilir veya erişimi reddedebilir veri:
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ümana işaret eder ve resource.data
değişkeni
belgede depolanan tüm alanların ve değerlerin bir haritası. Daha fazla
resource
değişkeni hakkında daha fazla bilgi için referansa
dokümanlarına göz atın.
Veri yazarken gelen verileri mevcut verilerle karşılaştırmak isteyebilirsiniz.
Bu durumda, kural kümeniz bekleyen yazmaya izin veriyorsa request.resource
değişkeni dokümanın gelecekteki durumunu içerir. Yalnızca şu özelliklere sahip update
işlemleri için:
bir alt kümeyi değiştirmek istediğinizde request.resource
değişkeni
işlemden sonraki beklemedeki doküman durumunu içermelidir. Alanı kontrol edebilirsiniz.
değerleri request.resource
içinde ayarlayarak istenmeyen veya tutarsız veri güncellemelerini önleyin:
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 dokümanlara erişme
Güvenlik kurallarınız, get()
ve exists()
işlevlerini kullanarak
gelen isteklerle veri tabanındaki diğer dokümanlar arasında karşılaştırma yapar. get()
ve
Her iki exists()
işlevinin de tam olarak belirtilmiş belge yolları olması gerekir. Bunu kullanırken
değişkenlerini oluşturmak istiyorsanız (ör. get()
ve exists()
)
escape değişkenlerini $(variable)
söz dizimini kullanarak belirtir.
Aşağıdaki örnekte, database
değişkeni,
ifadesi match /databases/{database}/documents
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 getAfter()
işlevini kullanarak bir
işlem veya yazma grubu tamamlandıktan sonra, ancak
taahhüt edilir. get()
gibi getAfter()
işlevi de
tam olarak belirtilen belge yolunu izleyin. Yazma gruplarını tanımlamak için getAfter()
kullanabilirsiniz
bir işlem veya grup halinde gerçekleşmesi gerekir.
Arama sınırlarına erişim
Kural grubu değerlendirmesi başına doküman erişimi çağrısı sınırı vardır:
- Tek belgeli istekler ve sorgu istekleri için 10.
-
çoklu belge okumaları, işlemler, için de kullanılabilir. Önceki 10 sınırı her öğe için de geçerlidir. işlemidir.
Örneğin, 3 yazma bilgisiyle bir toplu yazma isteği oluşturduğunuzu düşünün işlemleri için 2 doküman erişimi çağrısı kullandığını her yazmayı doğrular. Bu durumda, her yazmada 10 erişim çağrısı ve toplu yazma isteği, 20 erişim çağrısından 6'sını kullanır çağrısının en iyi yoludur.
Her iki sınırın da aşılması, "izin verilmedi" hatasıyla sonuçlanır. Bazı dokümanlar erişim çağrıları önbelleğe alınabilir. Önbelleğe alınan çağrılar bu sınıra dahil edilmez.
Bu sınırların işlemleri nasıl etkilediği hakkında ayrıntılı bir açıklama için toplu yazma işlemleri için atomik işlemleri güvenli hale getirme kılavuzuna bakın.
Aramalara ve fiyatlandırmaya erişin
Bu işlevleri kullanmak veritabanınızda bir okuma işlemi yürütür. Yani kurallarınız reddetse bile belgeleri okumak için faturalandırılırsınız talep ediyor. Cloud Firestore Fiyatlarını inceleyin bakın.
Özel işlevler
Güvenlik kurallarınız daha karmaşık hale geldikçe, farklı koşulları yerine getirerek, kural kümenizde yeniden kullanabilirsiniz. Güvenlik kuralları özel işlevleri destekleyin. Özel işlevlerin söz dizimi biraz JavaScript'e benzer, ancak güvenlik kuralları işlevleri alana özgü bir dilde yazılmış bazı önemli sınırlamaları vardır:
- İşlevler yalnızca tek bir
return
ifadesi içerebilir. Yapamayacakları mantıktan ibaret değildir. Örneğin, döngüleri yürütemez veya harici hizmetlerdir. - İşlevler, kapsamdaki işlevlere ve değişkenlere otomatik olarak erişebilir
bir belgedir. Örneğin,
service cloud.firestore
kapsamınınresource
değişkenine erişimi var veget()
ileexists()
gibi yerleşik işlevler. - İşlevler diğer işlevleri çağırabilir ancak yinelenmeyebilir. Toplam çağrı yığın derinliği 10 ile sınırlıdır.
v2
kural sürümünde, işlevlerlet
anahtar kelimesini kullanarak değişkenler tanımlayabilir. İşlevlerin en fazla 10 izin bağlaması olabilir, ancak dönüş ile bitmesi gerekir ifade eder.
Bir fonksiyon, function
anahtar kelimesiyle tanımlanır ve sıfır ya da daha fazla alan alır
bağımsız değişkenlerdir. Örneğin, 2023 Yılbaşı İndirimi
adında kullanılan iki koşul
aşağıdaki örneklerde tek bir işleve dönüştürürsünüz:
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ızdaki işlevleri kullanmak, artar.
Kurallar filtre değildir
Verilerinizin güvenliğini sağladıktan ve sorgu yazmaya başladıktan sonra, güvenliğin kuralları filtre değildir. Bir Cloud Firestore'un yalnızca geçerli istemcinin erişim izni vardır.
Ö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
öğesinin public
olmadığı belgeleri içerebilir:
. Ağ
db.collection("cities").get() .then(function(querySnapshot) { querySnapshot.forEach(function(doc) { console.log(doc.id, " => ", doc.data()); }); });
İzin verildi: where("visibility", "==", "public")
yan tümcesi sonuç kümesinin kuralın koşulunu karşıladığını garanti ettiğinden bu kural, aşağıdaki sorguya izin verir:
. Ağ
db.collection("cities").where("visibility", "==", "public").get() .then(function(querySnapshot) { querySnapshot.forEach(function(doc) { console.log(doc.id, " => ", doc.data()); }); });
Cloud Firestore güvenlik kuralları, her sorguyu potansiyeline göre değerlendirir bir doküman döndürebiliyorsa ve istek başarısız olursa, okuma izni yok. Sorgular, emin olmanız gerekir. Güvenlik kuralları ve sorgular hakkında daha fazla bilgi için bkz. güvenli daha fazla bilgi edinin.
Sonraki adımlar
- Güvenlik kurallarının sorgularınızı nasıl etkilediğini öğrenin.
- Güvenlik kurallarının nasıl yapılandırılacağını öğrenin.
- Güvenlik kuralları referansını okuyun.
- Cloud Storage for Firebase kullanan uygulamalarınız için şunları nasıl yazacağınızı öğrenin: Cloud Firestore belgelerine erişen Cloud Storage Güvenlik Kuralları koşulları.