Bu kılavuz, Cloud Firestore Güvenlik Kurallarınıza nasıl koşul ekleyeceğinizi göstermek için yapılandırma güvenlik kuralları kılavuzuna dayanmaktadır. Cloud Firestore Güvenlik Kurallarının temellerine aşina değilseniz başlangıç kılavuzuna bakın.
Cloud Firestore Güvenlik Kurallarının birincil yapı taşı koşuldur. Koşul, belirli bir işleme izin verilip verilmeyeceğini belirleyen bir mantıksal ifadedir. 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.
kimlik doğrulama
En yaygın güvenlik kuralı modellerinden biri, kullanıcının kimlik doğrulama durumuna göre erişimi denetlemektir. Ö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;
}
}
}
Diğer bir yaygın model, kullanıcıların yalnızca kendi verilerini okuyup yazabilmelerini 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 istemci için kimlik doğrulama bilgilerini içerir. request.auth
hakkında daha fazla bilgi için başvuru belgelerine bakın.
Veri doğrulama
Birçok uygulama, erişim kontrolü bilgilerini veritabanındaki belgelerde alanlar olarak depolar. Cloud Firestore Güvenlik Kuralları, belge verilerine göre dinamik olarak erişime 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 belgeye atıfta bulunur ve resource.data
, belgede depolanan tüm alanların ve değerlerin bir haritasıdır. resource
değişkeni hakkında daha fazla bilgi için başvuru belgelerine bakı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 belgenin gelecekteki durumunu içerir. Yalnızca belge alanlarının bir alt kümesini değiştiren update
işlemleri için request.resource
değişkeni, işlemden sonra bekleyen belge durumunu içerecektir. İ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şin
Güvenlik kurallarınız, get()
ve exists()
işlevlerini kullanarak, gelen istekleri veritabanındaki diğer belgelere göre değerlendirebilir. get()
ve exists()
işlevlerinin her ikisi de tam olarak belirtilmiş belge yolları bekler. get()
ve exists()
için yollar oluşturmak üzere değişkenleri kullanırken, $(variable)
sözdizimini kullanarak değişkenlerden açıkça kaçmanız gerekir.
Aşağıdaki örnekte, database
değişkeni match deyimi match /databases/{database}/documents
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şlem veya toplu yazma işlemi tamamlandıktan sonra ancak işlem veya toplu işlem tamamlanmadan önce belgenin durumuna erişmek için getAfter()
işlevini kullanabilirsiniz. get()
) işlevi gibi, getAfter()
işlevi de tam olarak belirlenmiş bir belge yolunu kullanır. Bir işlem veya toplu iş olarak birlikte gerçekleşmesi gereken yazma kümelerini tanımlamak için getAfter()
'ı kullanabilirsiniz.
Erişim arama limitleri
Kural seti değerlendirmesi başına belge erişim çağrılarında bir sınır vardır:
- Tek belge istekleri ve sorgu istekleri için 10.
Çoklu belge okumaları, işlemler ve toplu yazmalar için 20. Önceki 10 sınırı da her işlem için geçerlidir.
Örneğin, 3 yazma işlemi içeren toplu bir yazma isteği oluşturduğunuzu ve güvenlik kurallarınızın her yazmayı doğrulamak için 2 belge erişim çağrısı kullandığını hayal edin. Bu durumda, her yazma, 10 erişim çağrısından 2'sini kullanır ve toplu yazma isteği, 20 erişim çağrısından 6'sını kullanır.
Her iki sınırın aşılması, izin reddedildi hatasıyla sonuçlanır. Bazı belge erişim çağrıları önbelleğe alınabilir ve önbelleğe alınan çağrılar limitlere dahil edilmez.
Bu sınırların işlemleri ve toplu yazmaları nasıl etkilediğine ilişkin ayrıntılı bir açıklama için atomik işlemleri güvenceye alma kılavuzuna bakın.
Aramalara ve fiyatlandırmaya erişin
Bu işlevlerin kullanılması, veritabanınızda bir okuma işlemi yürütür; bu, kurallarınız isteği reddetse bile belgeleri okumak için faturalandırılacağınız anlamına gelir. Daha spesifik fatura bilgileri için Cloud Firestore Fiyatlandırmasına bakın.
Özel işlevler
Güvenlik kurallarınız daha karmaşık hale geldikçe, koşul kümelerini kural kümenizde yeniden kullanabileceğiniz işlevlere sarmak isteyebilirsiniz. Güvenlik kuralları özel işlevleri destekler. Özel işlevlerin sözdizimi biraz JavaScript'e benzer, ancak güvenlik kuralları işlevleri, bazı önemli sınırlamaları olan etki alanına özgü bir dilde yazılır:
- İşlevler yalnızca tek bir
return
ifadesi içerebilir. Herhangi bir ek mantık içeremezler. Örneğin, döngüleri yürütemezler veya harici hizmetleri arayamazlar. - Fonksiyonlar, tanımlandıkları kapsamdaki fonksiyonlara ve değişkenlere otomatik olarak erişebilirler. Örneğin,
service cloud.firestore
kapsamında tanımlanan bir işlevin,resource
değişkenine veget()
ve empty() gibi yerleşik işlevlere erişimiexists()
. - İşlevler diğer işlevleri çağırabilir ancak yinelenmeyebilir. Toplam çağrı yığını derinliği 10 ile sınırlıdır.
- Kural sürümü
v2
, işlevler,let
anahtar sözcüğünü kullanarak değişkenleri tanımlayabilir. İşlevler en fazla 10 izin bağlamasına sahip olabilir, ancak bir dönüş ifadesiyle bitmelidir.
Bir işlev, function
anahtar sözcüğüyle tanımlanır ve sıfır veya daha fazla argüman 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ızdaki işlevleri kullanmak, kurallarınızın karmaşıklığı arttıkça onları daha sürdürülebilir hale getirir.
Kurallar filtre değildir
Verilerinizi güvence altına alıp sorgu yazmaya başladığınızda, güvenlik kurallarının filtre olmadığını unutmayın. Bir koleksiyondaki tüm belgeler için sorgu yazamaz ve Cloud Firestore'un yalnızca geçerli istemcinin erişim iznine sahip olduğu belgeleri 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 : Sonuç kümesi, visibility
public
olmadığı belgeleri içerebileceğinden, bu kural aşağıdaki sorguyu reddeder:
ağ
db.collection("cities").get() .then(function(querySnapshot) { querySnapshot.forEach(function(doc) { console.log(doc.id, " => ", doc.data()); }); });
Allowed : Bu kural aşağıdaki sorguya izin verir çünkü where("visibility", "==", "public")
yan tümcesi, sonuç kümesinin kuralın koşulunu karşıladığını garanti eder:
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 potansiyel sonucuna göre değerlendirir ve müşterinin okuma iznine sahip olmadığı bir belge döndürme olasılığı varsa 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 bkz. verileri güvenli bir şekilde sorgulama .
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ız için, Cloud Firestore belgelerine erişen Cloud Storage Güvenlik Kuralları koşullarını nasıl yazacağınızı öğrenin.