Firebase Güvenlik Kuralları, çok çeşitli karmaşıklığı ve ayrıntı düzeyini destekleyen esnek, güçlü ve özel dillerden yararlanır. Kurallarınızı uygulamanız için anlamlı olduğu kadar spesifik veya genel hale getirebilirsiniz. Gerçek Zamanlı Veritabanı kuralları, JSON yapısında JavaScript'e benzeyen bir sözdizimi kullanır. Cloud Firestore ve Cloud Storage kuralları, match CEL'i temel alan ve koşullu olarak verilen erişimi destekleyen ifadelere allow Ortak İfade Dili'ni (CEL) temel alan bir dil kullanır.
Ancak bunlar özel diller olduğu için bir öğrenme eğrisi vardır. Daha karmaşık kuralların derinliklerine inerken Kurallar dilini daha iyi anlamak için bu kılavuzu kullanın.
Kuralları hakkında daha fazla bilgi edinmek için bir ürün seçin.
Basit yapı
Bulut Firestore
Cloud Firestore ve Cloud Storage'daki Firebase Güvenlik Kuralları aşağıdaki yapıyı ve sözdizimini kullanır:
service <<name>> {
// Match the resource path.
match <<path>> {
// Allow the request if the following conditions are true.
allow <<methods>> : if <<condition>>
}
}
Kuralları oluştururken aşağıdaki temel kavramları anlamanız önemlidir:
- İstek:
allowifadesinde çağrılan yöntem veya yöntemler. Bunlar çalıştırılmasına izin verdiğiniz yöntemlerdir. Standart yöntemler şunlardır:get,list,create,updatevedelete.readvewritekolaylığı sağlayan yöntemler, belirtilen veritabanı veya depolama yolunda geniş okuma ve yazma erişimi sağlar. - Yol: URI yolu olarak temsil edilen veritabanı veya depolama konumu.
- Kural: Bir isteğin doğru olarak değerlendirilmesi durumunda izin veren bir koşulu içeren
allowifadesi.
Bu kavramların her biri aşağıda daha ayrıntılı olarak açıklanmaktadır.
Bulut depolama
Cloud Firestore ve Cloud Storage'daki Firebase Güvenlik Kuralları aşağıdaki yapıyı ve sözdizimini kullanır:
service <<name>> {
// Match the resource path.
match <<path>> {
// Allow the request if the following conditions are true.
allow <<methods>> : if <<condition>>
}
}
Kuralları oluştururken aşağıdaki temel kavramları anlamanız önemlidir:
- İstek:
allowifadesinde çağrılan yöntem veya yöntemler. Bunlar çalıştırılmasına izin verdiğiniz yöntemlerdir. Standart yöntemler şunlardır:get,list,create,updatevedelete.readvewritekolaylığı sağlayan yöntemler, belirtilen veritabanı veya depolama yolunda geniş okuma ve yazma erişimi sağlar. - Yol: URI yolu olarak temsil edilen veritabanı veya depolama konumu.
- Kural: Bir isteğin doğru olarak değerlendirilmesi durumunda izin veren bir koşulu içeren
allowifadesi.
Bu kavramların her biri aşağıda daha ayrıntılı olarak açıklanmaktadır.
Gerçek Zamanlı Veritabanı
Gerçek Zamanlı Veritabanında Firebase Güvenlik Kuralları, bir JSON belgesinde yer alan JavaScript benzeri ifadelerden oluşur.
Aşağıdaki sözdizimini kullanırlar:
{
"rules": {
"<<path>>": {
// Allow the request if the condition for each method is true.
".read": <<condition>>,
".write": <<condition>>,
".validate": <<condition>>
}
}
}
Kuralda üç temel unsur bulunmaktadır:
- Yol: Veritabanı konumu. Bu, veritabanınızın JSON yapısını yansıtır.
- İstek: Bunlar, kuralın erişim izni vermek için kullandığı yöntemlerdir.
readvewritekuralları geniş okuma ve yazma erişimi sağlarkenvalidatekuralları, gelen veya mevcut verilere dayalı olarak erişim izni vermek için ikincil bir doğrulama işlevi görür. - Koşul: Bir isteğin doğru olarak değerlendirilmesi durumunda izin veren koşul.
Kural yapıları
Bulut Firestore
Cloud Firestore ve Cloud Storage'daki bir kuralın temel öğeleri aşağıdaki gibidir:
-
servicebeyanı: Kuralların geçerli olduğu Firebase ürününü bildirir. -
matchbloğu: Veritabanında veya kuralların geçerli olduğu depolama paketinde bir yol tanımlar. -
allowifadesi: Erişim izni vermek için yöntemlere göre farklılaştırılmış koşullar sağlar. Desteklenen yöntemler şunları içerir:get,list,create,update,deleteve kullanışlıreadvewriteyöntemleri. - İsteğe bağlı
functionbildirimleri: Birden fazla kuralda kullanım için koşulları birleştirme ve sarma yeteneği sağlar.
service , isteklere erişim sağlayan koşulları sağlayan allow ifadelerine sahip bir veya daha fazla match bloğu içerir. request ve resource değişkenleri kural koşullarında kullanıma uygundur. Firebase Güvenlik Kuralları dili aynı zamanda function bildirimlerini de destekler.
Sözdizimi sürümü
syntax ifadesi, kaynağı yazmak için kullanılan Firebase Kuralları dilinin sürümünü belirtir. Dilin en son sürümü v2 .
rules_version = '2';
service cloud.firestore {
...
}
Hiçbir rules_version ifadesi sağlanmazsa kurallarınız v1 motoru kullanılarak değerlendirilecektir.
Hizmet
service beyanı, kurallarınızın hangi Firebase ürünü veya hizmeti için geçerli olduğunu tanımlar. Kaynak dosya başına yalnızca bir service bildirimi ekleyebilirsiniz.
Bulut Firestore
service cloud.firestore {
// Your 'match' blocks with their corresponding 'allow' statements and
// optional 'function' declarations are contained here
}
Bulut depolama
service firebase.storage {
// Your 'match' blocks with their corresponding 'allow' statements and
// optional 'function' declarations are contained here
}
Firebase CLI'yi kullanarak hem Cloud Firestore hem de Cloud Storage için kurallar tanımlıyorsanız bunları ayrı dosyalarda tutmanız gerekir.
Kibrit
Bir match bloğu, istenen işlemin yolu (gelen request.path ) ile eşleşen bir path modelini bildirir. match gövdesinde bir veya daha fazla iç içe geçmiş match bloğu, allow ifadeleri veya function bildirimleri bulunmalıdır. İç içe geçmiş match bloklarındaki yol, üst match bloğundaki yola görelidir.
path modeli, değişkenler veya joker karakterler içerebilen dizin benzeri bir addır. path modeli, tek yollu bölüm ve çok yollu bölüm eşleşmelerine olanak tanır. Bir path bağlı tüm değişkenler, match kapsamında veya path bildirildiği herhangi bir iç içe kapsam içinde görünür.
Bir path modeliyle eşleşmeler kısmi veya tam olabilir:
- Kısmi eşleşmeler:
pathmodelirequest.pathdosyasının önek eşleşmesidir. - Tam eşleşmeler:
pathmodelirequest.pathtamamıyla eşleşir.
Tam bir eşleşme yapıldığında blok içindeki kurallar değerlendirilir. Kısmi bir eşleşme yapıldığında, iç içe geçmiş match kuralları, herhangi bir iç içe path eşleşmeyi tamamlayıp tamamlamayacağını görmek için test edilir.
Her tam match kurallar, isteğe izin verilip verilmeyeceğini belirlemek için değerlendirilir. Herhangi bir eşleşen kural erişim izni verirse isteğe izin verilir. Eşleşen bir kural erişim izni vermiyorsa istek reddedilir.
// Given request.path == /example/hello/nested/path the following
// declarations indicate whether they are a partial or complete match and
// the value of any variables visible within the scope.
service firebase.storage {
// Partial match.
match /example/{singleSegment} { // `singleSegment` == 'hello'
allow write; // Write rule not evaluated.
// Complete match.
match /nested/path { // `singleSegment` visible in scope.
allow read; // Read rule is evaluated.
}
}
// Complete match.
match /example/{multiSegment=**} { // `multiSegment` == /hello/nested/path
allow read; // Read rule is evaluated.
}
}
Yukarıdaki örnekte gösterildiği gibi path bildirimleri aşağıdaki değişkenleri destekler:
- Tek bölümlü joker karakter: Bir joker karakter değişkeni, bir değişkeni küme parantezleri içine alarak bir yolda bildirilir:
{variable}. Bu değişkenematchdeyimi içinde birstringolarak erişilebilir. - Özyinelemeli joker karakter: Özyinelemeli veya çok bölümlü joker karakter, bir yoldaki veya altındaki birden çok yol bölümüyle eşleşir. Bu joker karakter, ayarladığınız konumun altındaki tüm yollarla eşleşir. Segment değişkeninizin sonuna
=**dizesini ekleyerek bunu bildirebilirsiniz:{variable=**}. Bu değişkenematchdeyimi içerisinde birpathnesnesi olarak erişilebilir.
İzin vermek
match bloğu bir veya daha fazla allow ifadesi içerir. Bunlar sizin gerçek kurallarınızdır. allow kurallarını bir veya daha fazla yönteme uygulayabilirsiniz. allow ifadesindeki koşulların, Cloud Firestore veya Cloud Storage'ın gelen herhangi bir isteği kabul etmesi için doğru olarak değerlendirilmesi gerekir. Ayrıca, allow ifadeleri koşulsuz da yazabilirsiniz; örneğin, allow read . Ancak allow ifadesi bir koşul içermiyorsa, o yönteme yönelik isteğe her zaman izin verir.
Yöntemin allow kurallarından herhangi biri karşılanırsa isteğe izin verilir. Ayrıca, daha geniş bir kural erişim izni veriyorsa, Kurallar erişim izni verir ve erişimi sınırlandırabilecek daha ayrıntılı kuralları yok sayar.
Herhangi bir kullanıcının kendi dosyalarından herhangi birini okuyabildiği veya silebildiği aşağıdaki örneği düşünün. Daha ayrıntılı bir kural, yalnızca yazma isteğinde bulunan kullanıcının dosyanın sahibi olması ve dosyanın PNG olması durumunda yazma işlemlerine izin verir. Önceki kural buna izin verdiğinden, kullanıcı PNG olmasa bile alt yoldaki herhangi bir dosyayı silebilir.
service firebase.storage {
// Allow the requestor to read or delete any resource on a path under the
// user directory.
match /users/{userId}/{anyUserFile=**} {
allow read, delete: if request.auth != null && request.auth.uid == userId;
}
// Allow the requestor to create or update their own images.
// When 'request.method' == 'delete' this rule and the one matching
// any path under the user directory would both match and the `delete`
// would be permitted.
match /users/{userId}/images/{imageId} {
// Whether to permit the request depends on the logical OR of all
// matched rules. This means that even if this rule did not explicitly
// allow the 'delete' the earlier rule would have.
allow write: if request.auth != null && request.auth.uid == userId && imageId.matches('*.png');
}
}
Yöntem
Her allow ifadesi, aynı yöntemin gelen isteklerine erişim izni veren bir yöntem içerir.
| Yöntem | İstek tipi |
|---|---|
| Kolaylık yöntemleri | |
read | Her türlü okuma isteği |
write | Her türlü yazma isteği |
| Standart yöntemler | |
get | Tek belgelere veya dosyalara yönelik okuma istekleri |
list | Sorgu ve koleksiyon isteklerini okuma |
create | Yeni belgeler veya dosyalar yazın |
update | Mevcut veritabanı belgelerine yazın veya dosya meta verilerini güncelleyin |
delete | Verileri sil |
Aynı match bloğundaki okuma yöntemlerini veya aynı path bildiriminde çakışan yazma yöntemlerini çakıştıramazsınız.
Örneğin aşağıdaki kurallar başarısız olur:
service bad.example {
match /rules/with/overlapping/methods {
// This rule allows reads to all authenticated users
allow read: if request.auth != null;
match another/subpath {
// This secondary, more specific read rule causes an error
allow get: if request.auth != null && request.auth.uid == "me";
// Overlapping write methods in the same path cause an error as well
allow write: if request.auth != null;
allow create: if request.auth != null && request.auth.uid == "me";
}
}
}
İşlev
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ırlamalara sahip olan alana özgü bir dilde yazılmıştır:
- Fonksiyonlar yalnızca tek bir
returndeyimi içerebilir. Herhangi bir ek mantık içeremezler. Örneğin döngüleri yürütemez veya harici hizmetleri arayamazlar. - İş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şlevin,resourcedeğişkenine veget()veexists()gibi yerleşik işlevlere erişimi vardır. - Fonksiyonlar diğer fonksiyonları çağırabilir ancak yinelenmeyebilir. Toplam çağrı yığını derinliği 20 ile sınırlıdır.
- Kural
v2sürümünde işlevler,letanahtar sözcüğünü kullanarak değişkenleri tanımlayabilir. İşlevler en fazla 10 let bağlamaya sahip olabilir ancak bir return ifadesiyle bitmelidir.
Bir işlev, function anahtar sözcüğüyle 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 tür koşulu tek bir fonksiyonda 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();
}
}
}
Burada fonksiyon argümanlarını ve izin atamalarını gösteren bir örnek verilmiştir. Let atama ifadeleri noktalı virgülle ayrılmalıdır.
function isAuthorOrAdmin(userId, article) {
let isAuthor = article.author == userId;
let isAdmin = exists(/databases/$(database)/documents/admins/$(userId));
return isAuthor || isAdmin;
}
isAdmin atamasının, admins koleksiyonunun aranmasını nasıl zorunlu kıldığına dikkat edin. Gereksiz aramalara gerek kalmadan tembel değerlendirme için && (AND) ve || 'nin kısa devre yapan doğasından yararlanın. (OR) karşılaştırmalar, yalnızca isAuthor doğru ( && karşılaştırmaları için) veya yanlış ( || karşılaştırmaları için) olması durumunda ikinci bir işlevi çağırmak için kullanılır.
function isAdmin(userId) {
return exists(/databases/$(database)/documents/admins/$(userId));
}
function isAuthorOrAdmin(userId, article) {
let isAuthor = article.author == userId;
// `||` is short-circuiting; isAdmin called only if isAuthor == false.
return isAuthor || isAdmin(userId);
}
Güvenlik kurallarınızdaki işlevlerin kullanılması, kurallarınızın karmaşıklığı arttıkça bunların daha sürdürülebilir olmasını sağlar.
Bulut depolama
Cloud Firestore ve Cloud Storage'daki bir kuralın temel öğeleri aşağıdaki gibidir:
-
servicebeyanı: Kuralların geçerli olduğu Firebase ürününü bildirir. -
matchbloğu: Veritabanında veya kuralların geçerli olduğu depolama paketinde bir yol tanımlar. -
allowifadesi: Erişim izni vermek için yöntemlere göre farklılaştırılmış koşullar sağlar. Desteklenen yöntemler şunları içerir:get,list,create,update,deleteve kullanışlıreadvewriteyöntemleri. - İsteğe bağlı
functionbildirimleri: Birden fazla kuralda kullanım için koşulları birleştirme ve sarma yeteneği sağlar.
service , isteklere erişim sağlayan koşulları sağlayan allow ifadelerine sahip bir veya daha fazla match bloğu içerir. request ve resource değişkenleri kural koşullarında kullanıma uygundur. Firebase Güvenlik Kuralları dili aynı zamanda function bildirimlerini de destekler.
Sözdizimi sürümü
syntax ifadesi, kaynağı yazmak için kullanılan Firebase Kuralları dilinin sürümünü belirtir. Dilin en son sürümü v2 .
rules_version = '2';
service cloud.firestore {
...
}
Hiçbir rules_version ifadesi sağlanmazsa kurallarınız v1 motoru kullanılarak değerlendirilecektir.
Hizmet
service beyanı, kurallarınızın hangi Firebase ürünü veya hizmeti için geçerli olduğunu tanımlar. Kaynak dosya başına yalnızca bir service bildirimi ekleyebilirsiniz.
Bulut Firestore
service cloud.firestore {
// Your 'match' blocks with their corresponding 'allow' statements and
// optional 'function' declarations are contained here
}
Bulut depolama
service firebase.storage {
// Your 'match' blocks with their corresponding 'allow' statements and
// optional 'function' declarations are contained here
}
Firebase CLI'yi kullanarak hem Cloud Firestore hem de Cloud Storage için kurallar tanımlıyorsanız bunları ayrı dosyalarda tutmanız gerekir.
Kibrit
Bir match bloğu, istenen işlemin yolu (gelen request.path ) ile eşleşen bir path modelini bildirir. match gövdesinde bir veya daha fazla iç içe geçmiş match bloğu, allow ifadeleri veya function bildirimleri bulunmalıdır. İç içe geçmiş match bloklarındaki yol, üst match bloğundaki yola görelidir.
path modeli, değişkenler veya joker karakterler içerebilen dizin benzeri bir addır. path modeli, tek yollu bölüm ve çok yollu bölüm eşleşmelerine olanak tanır. Bir path bağlı tüm değişkenler, match kapsamında veya path bildirildiği herhangi bir iç içe kapsam içinde görünür.
Bir path modeliyle eşleşmeler kısmi veya tam olabilir:
- Kısmi eşleşmeler:
pathmodelirequest.pathdosyasının önek eşleşmesidir. - Tam eşleşmeler:
pathmodelirequest.pathtamamıyla eşleşir.
Tam bir eşleşme yapıldığında blok içindeki kurallar değerlendirilir. Kısmi bir eşleşme yapıldığında, iç içe geçmiş match kuralları, herhangi bir iç içe path eşleşmeyi tamamlayıp tamamlamayacağını görmek için test edilir.
Her tam match kurallar, isteğe izin verilip verilmeyeceğini belirlemek için değerlendirilir. Herhangi bir eşleşen kural erişim izni verirse isteğe izin verilir. Eşleşen bir kural erişim izni vermiyorsa istek reddedilir.
// Given request.path == /example/hello/nested/path the following
// declarations indicate whether they are a partial or complete match and
// the value of any variables visible within the scope.
service firebase.storage {
// Partial match.
match /example/{singleSegment} { // `singleSegment` == 'hello'
allow write; // Write rule not evaluated.
// Complete match.
match /nested/path { // `singleSegment` visible in scope.
allow read; // Read rule is evaluated.
}
}
// Complete match.
match /example/{multiSegment=**} { // `multiSegment` == /hello/nested/path
allow read; // Read rule is evaluated.
}
}
Yukarıdaki örnekte gösterildiği gibi path bildirimleri aşağıdaki değişkenleri destekler:
- Tek bölümlü joker karakter: Bir joker karakter değişkeni, bir değişkeni küme parantezleri içine alarak bir yolda bildirilir:
{variable}. Bu değişkenematchdeyimi içinde birstringolarak erişilebilir. - Özyinelemeli joker karakter: Özyinelemeli veya çok bölümlü joker karakter, bir yoldaki veya altındaki birden çok yol bölümüyle eşleşir. Bu joker karakter, ayarladığınız konumun altındaki tüm yollarla eşleşir. Segment değişkeninizin sonuna
=**dizesini ekleyerek bunu bildirebilirsiniz:{variable=**}. Bu değişkenematchdeyimi içerisinde birpathnesnesi olarak erişilebilir.
İzin vermek
match bloğu bir veya daha fazla allow ifadesi içerir. Bunlar sizin gerçek kurallarınızdır. allow kurallarını bir veya daha fazla yönteme uygulayabilirsiniz. allow ifadesindeki koşulların, Cloud Firestore veya Cloud Storage'ın gelen herhangi bir isteği kabul etmesi için doğru olarak değerlendirilmesi gerekir. Ayrıca, allow ifadeleri koşulsuz da yazabilirsiniz; örneğin, allow read . Ancak allow ifadesi bir koşul içermiyorsa, o yönteme yönelik isteğe her zaman izin verir.
Yöntemin allow kurallarından herhangi biri karşılanırsa isteğe izin verilir. Ayrıca, daha geniş bir kural erişim izni veriyorsa, Kurallar erişim izni verir ve erişimi sınırlandırabilecek daha ayrıntılı kuralları yok sayar.
Herhangi bir kullanıcının kendi dosyalarından herhangi birini okuyabildiği veya silebildiği aşağıdaki örneği düşünün. Daha ayrıntılı bir kural, yalnızca yazma isteğinde bulunan kullanıcının dosyanın sahibi olması ve dosyanın PNG olması durumunda yazma işlemlerine izin verir. Önceki kural buna izin verdiğinden, kullanıcı PNG olmasa bile alt yoldaki herhangi bir dosyayı silebilir.
service firebase.storage {
// Allow the requestor to read or delete any resource on a path under the
// user directory.
match /users/{userId}/{anyUserFile=**} {
allow read, delete: if request.auth != null && request.auth.uid == userId;
}
// Allow the requestor to create or update their own images.
// When 'request.method' == 'delete' this rule and the one matching
// any path under the user directory would both match and the `delete`
// would be permitted.
match /users/{userId}/images/{imageId} {
// Whether to permit the request depends on the logical OR of all
// matched rules. This means that even if this rule did not explicitly
// allow the 'delete' the earlier rule would have.
allow write: if request.auth != null && request.auth.uid == userId && imageId.matches('*.png');
}
}
Yöntem
Her allow ifadesi, aynı yöntemin gelen isteklerine erişim izni veren bir yöntem içerir.
| Yöntem | İstek tipi |
|---|---|
| Kolaylık yöntemleri | |
read | Her türlü okuma isteği |
write | Her türlü yazma isteği |
| Standart yöntemler | |
get | Tek belgeler veya dosyalar için okuma istekleri |
list | Sorgu ve koleksiyon isteklerini okuma |
create | Yeni belgeler veya dosyalar yazın |
update | Mevcut veritabanı belgelerine yazın veya dosya meta verilerini güncelleyin |
delete | Verileri sil |
Aynı match bloğundaki okuma yöntemlerini veya aynı path bildiriminde çakışan yazma yöntemlerini çakıştıramazsınız.
Örneğin aşağıdaki kurallar başarısız olur:
service bad.example {
match /rules/with/overlapping/methods {
// This rule allows reads to all authenticated users
allow read: if request.auth != null;
match another/subpath {
// This secondary, more specific read rule causes an error
allow get: if request.auth != null && request.auth.uid == "me";
// Overlapping write methods in the same path cause an error as well
allow write: if request.auth != null;
allow create: if request.auth != null && request.auth.uid == "me";
}
}
}
İşlev
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ırlamalara sahip olan alana özgü bir dilde yazılmıştır:
- Fonksiyonlar yalnızca tek bir
returndeyimi içerebilir. Herhangi bir ek mantık içeremezler. Örneğin döngüleri yürütemezler veya harici hizmetleri arayamazlar. - İş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şlevin,resourcedeğişkenine veget()veexists()gibi yerleşik işlevlere erişimi vardır. - Fonksiyonlar diğer fonksiyonları çağırabilir ancak yinelenmeyebilir. Toplam çağrı yığını derinliği 20 ile sınırlıdır.
- Kural
v2sürümünde işlevler,letanahtar sözcüğünü kullanarak değişkenleri tanımlayabilir. İşlevler en fazla 10 let bağlamaya sahip olabilir ancak bir return ifadesiyle bitmelidir.
Bir işlev, function anahtar sözcüğüyle 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 tür koşulu tek bir fonksiyonda 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();
}
}
}
Burada fonksiyon argümanlarını ve izin atamalarını gösteren bir örnek verilmiştir. Let atama ifadeleri noktalı virgülle ayrılmalıdır.
function isAuthorOrAdmin(userId, article) {
let isAuthor = article.author == userId;
let isAdmin = exists(/databases/$(database)/documents/admins/$(userId));
return isAuthor || isAdmin;
}
isAdmin atamasının, admins koleksiyonunun aranmasını nasıl zorunlu kıldığına dikkat edin. Gereksiz aramalara gerek kalmadan tembel değerlendirme için && (AND) ve || 'nin kısa devre yapan doğasından yararlanın. (OR) karşılaştırmalar, yalnızca isAuthor doğru ( && karşılaştırmaları için) veya yanlış ( || karşılaştırmaları için) olması durumunda ikinci bir işlevi çağırmak için kullanılır.
function isAdmin(userId) {
return exists(/databases/$(database)/documents/admins/$(userId));
}
function isAuthorOrAdmin(userId, article) {
let isAuthor = article.author == userId;
// `||` is short-circuiting; isAdmin called only if isAuthor == false.
return isAuthor || isAdmin(userId);
}
Güvenlik kurallarınızdaki işlevlerin kullanılması, kurallarınızın karmaşıklığı arttıkça bunların daha sürdürülebilir olmasını sağlar.
Gerçek Zamanlı Veritabanı
Yukarıda özetlendiği gibi, Gerçek Zamanlı Veritabanı Kuralları üç temel öğeyi içerir: veritabanının JSON yapısının bir yansıması olarak veritabanı konumu, istek türü ve erişim izni veren koşul.
Veritabanı konumu
Kurallarınızın yapısı, veritabanınızda sakladığınız verilerin yapısına uygun olmalıdır. Örneğin, mesaj listesi içeren bir sohbet uygulamasında şuna benzeyen verileriniz olabilir:
{
"messages": {
"message0": {
"content": "Hello",
"timestamp": 1405704370369
},
"message1": {
"content": "Goodbye",
"timestamp": 1405704395231
},
...
}
}
Kurallarınız bu yapıyı yansıtmalıdır. Örneğin:
{
"rules": {
"messages": {
"$message": {
// only messages from the last ten minutes can be read
".read": "data.child('timestamp').val() > (now - 600000)",
// new messages must have a string content and a number timestamp
".validate": "newData.hasChildren(['content', 'timestamp']) &&
newData.child('content').isString() &&
newData.child('timestamp').isNumber()"
}
}
}
}
Yukarıdaki örnekte gösterildiği gibi, Gerçek Zamanlı Veritabanı Kuralları, yol bölümlerini eşleştirmek için $location değişkenini destekler. Kuralınızı yol boyunca herhangi bir alt düğümle eşleştirmek için yol bölümünüzün önüne $ önekini kullanın.
{
"rules": {
"rooms": {
// This rule applies to any child of /rooms/, the key for each room id
// is stored inside $room_id variable for reference
"$room_id": {
"topic": {
// The room's topic can be changed if the room id has "public" in it
".write": "$room_id.contains('public')"
}
}
}
}
}
$variable sabit yol adlarıyla paralel olarak da kullanabilirsiniz.
{
"rules": {
"widget": {
// a widget can have a title or color attribute
"title": { ".validate": true },
"color": { ".validate": true },
// but no other child paths are allowed
// in this case, $other means any key excluding "title" and "color"
"$other": { ".validate": false }
}
}
}
Yöntem
Gerçek Zamanlı Veritabanında üç tür kural vardır. Bu kural türlerinden ikisi ( read ve write ) gelen bir isteğin yöntemine uygulanır. validate kural türü, veri yapılarını zorlar ve verilerin biçimini ve içeriğini doğrular. Kurallar, bir .write kuralının erişim izni verdiğini doğruladıktan sonra .validate kurallarını çalıştırır.
| Kural Türleri | |
|---|---|
| .Okumak | Verilerin kullanıcılar tarafından okunmasına izin verilip verilmediğini ve ne zaman izin verildiğini açıklar. |
| .yazmak | Verilerin yazılmasına izin verilip verilmeyeceğini ve ne zaman yazılacağını açıklar. |
| .doğrula | Doğru biçimlendirilmiş bir değerin nasıl görüneceğini, alt özniteliklere sahip olup olmadığını ve veri türünü tanımlar. |
Varsayılan olarak buna izin veren bir kural yoksa bir yola erişim reddedilir.
İnşaat koşulları
Bulut Firestore
Koşul, belirli bir işleme izin verilmesi veya reddedilmesi gerektiğini belirleyen bir boole ifadesidir. request ve resource değişkenleri bu koşullar için bağlam sağlar.
request değişkeni
request değişkeni aşağıdaki alanları ve ilgili bilgileri içerir:
request.auth
Firebase Authentication'dan gelen kimlik doğrulama bilgilerini içeren bir JSON Web Belirteci (JWT). auth belirteci, bir dizi standart talebi ve Firebase Authentication aracılığıyla oluşturduğunuz tüm özel talepleri içerir. Firebase Güvenlik Kuralları ve Kimlik Doğrulaması hakkında daha fazla bilgi edinin.
request.method
request.method standart yöntemlerden herhangi biri veya özel bir yöntem olabilir. Kolay read ve write yöntemleri, sırasıyla tüm salt okunur veya tüm salt yazılır standart yöntemlere uygulanan yazma kurallarını basitleştirmek için de mevcuttur.
request.params
request.params özellikle request.resource ile ilgili olmayan ve değerlendirme için yararlı olabilecek her türlü veriyi içerir. Uygulamada bu harita tüm standart yöntemler için boş olmalı ve özel yöntemler için kaynak olmayan veriler içermelidir. Hizmetler, parametre olarak sunulan anahtarların ve değerlerin türünü yeniden adlandırmamaya veya değiştirmemeye dikkat etmelidir.
request.path
request.path hedef resource yoludur. Yol hizmete göredir. / gibi URL güvenli olmayan karakterler içeren yol bölümleri url olarak kodlanmıştır.
resource değişkeni
resource anahtar/değer çiftlerinin haritası olarak temsil edilen hizmet içindeki geçerli değerdir. Bir koşul içindeki resource başvurulması, hizmetten değerin en fazla bir kez okunmasıyla sonuçlanacaktır. Bu arama, kaynağın hizmetle ilgili kotasına dahil edilecektir. get istekleri için resource yalnızca reddetme durumunda kotaya dahil edilir.
Operatörler ve operatör önceliği
Operatörler ve bunların Cloud Firestore ve Cloud Storage Kurallarında karşılık gelen öncelikleri için aşağıdaki tabloyu referans olarak kullanın.
Rastgele a ve b ifadeleri, bir f alanı ve bir i dizini verildiğinde.
| Şebeke | Tanım | çağrışımsallık |
|---|---|---|
a[i] a() af | Dizin, çağrı, alan erişimi | soldan sağa | !a -a | Tekli olumsuzlama | sağdan sola |
a/ba%ba*b | Çarpma operatörleri | soldan sağa |
a+b ab | Eklemeli operatörler | soldan sağa |
a>ba>=ba | İlişkisel operatörler | soldan sağa |
a in b | Listede veya haritada bulunma | soldan sağa |
a is type | Türün bool, int, float, sayı, dize, liste, harita, zaman damgası, süre, yol veya latlng olabileceği type karşılaştırması | soldan sağa |
a==ba!=b | Karşılaştırma operatörleri | soldan sağa | a && b | Koşullu VE | soldan sağa |
a || b | Koşullu VEYA | soldan sağa |
a ? true_value : false_value | Üçlü ifade | soldan sağa |
Bulut depolama
Koşul, belirli bir işleme izin verilmesi veya reddedilmesi gerektiğini belirleyen bir boole ifadesidir. request ve resource değişkenleri bu koşullar için bağlam sağlar.
request değişkeni
request değişkeni aşağıdaki alanları ve ilgili bilgileri içerir:
request.auth
Firebase Authentication'dan gelen kimlik doğrulama bilgilerini içeren bir JSON Web Belirteci (JWT). auth belirteci, bir dizi standart talebi ve Firebase Authentication aracılığıyla oluşturduğunuz tüm özel talepleri içerir. Firebase Güvenlik Kuralları ve Kimlik Doğrulaması hakkında daha fazla bilgi edinin.
request.method
request.method standart yöntemlerden herhangi biri veya özel bir yöntem olabilir. Kolay read ve write yöntemleri, sırasıyla tüm salt okunur veya tüm salt yazılır standart yöntemlere uygulanan yazma kurallarını basitleştirmek için de mevcuttur.
request.params
request.params özellikle request.resource ile ilgili olmayan ve değerlendirme için yararlı olabilecek her türlü veriyi içerir. Uygulamada bu harita tüm standart yöntemler için boş olmalı ve özel yöntemler için kaynak olmayan veriler içermelidir. Hizmetler, parametre olarak sunulan anahtarların ve değerlerin türünü yeniden adlandırmamaya veya değiştirmemeye dikkat etmelidir.
request.path
request.path hedef resource yoludur. Yol hizmete göredir. / gibi URL güvenli olmayan karakterler içeren yol bölümleri url olarak kodlanmıştır.
resource değişkeni
resource anahtar/değer çiftlerinin haritası olarak temsil edilen hizmet içindeki geçerli değerdir. Bir koşul içindeki resource başvurulması, hizmetten değerin en fazla bir kez okunmasıyla sonuçlanacaktır. Bu arama, kaynağın hizmetle ilgili kotasına dahil edilecektir. get istekleri için resource yalnızca reddetme durumunda kotaya dahil edilir.
Operatörler ve operatör önceliği
Operatörler ve bunların Cloud Firestore ve Cloud Storage Kurallarında karşılık gelen öncelikleri için aşağıdaki tabloyu referans olarak kullanın.
Rastgele a ve b ifadeleri, bir f alanı ve bir i dizini verildiğinde.
| Şebeke | Tanım | çağrışımsallık |
|---|---|---|
a[i] a() af | Dizin, çağrı, alan erişimi | soldan sağa | !a -a | Tekli olumsuzluk | sağdan sola |
a/ba%ba*b | Çarpma operatörleri | soldan sağa |
a+b ab | Eklemeli operatörler | soldan sağa |
a>ba>=ba | İlişkisel operatörler | soldan sağa |
a in b | Listede veya haritada bulunma | soldan sağa |
a is type | Türün bool, int, float, sayı, dize, liste, harita, zaman damgası, süre, yol veya latlng olabileceği type karşılaştırması | soldan sağa |
a==ba!=b | Karşılaştırma operatörleri | soldan sağa | a && b | Koşullu VE | soldan sağa |
a || b | Koşullu VEYA | soldan sağa |
a ? true_value : false_value | Üçlü ifade | soldan sağa |
Gerçek Zamanlı Veritabanı
Koşul, belirli bir işleme izin verilmesi veya reddedilmesi gerektiğini belirleyen bir boole ifadesidir. Bu koşulları Gerçek Zamanlı Veritabanı Kurallarında aşağıdaki yollarla tanımlayabilirsiniz.
Önceden tanımlanmış değişkenler
Bir kural tanımının içinden erişilebilecek çok sayıda yararlı, önceden tanımlanmış değişken vardır. İşte her birinin kısa bir özeti:
| Önceden Tanımlanmış Değişkenler | |
|---|---|
| Şimdi | Linux çağından bu yana milisaniye cinsinden geçerli zaman. Bu, özellikle SDK'nın firebase.database.ServerValue.TIMESTAMP ile oluşturulan zaman damgalarını doğrulamak için işe yarar. |
| kök | Firebase veritabanındaki kök yolunu, denenen işlemden önceki haliyle temsil eden bir RuleDataSnapshot . |
| yeni veri | Verileri, denenen işlemden sonra var olacağı haliyle temsil eden bir RuleDataSnapshot . Yazılmakta olan yeni verileri ve mevcut verileri içerir. |
| veri | Verileri, denenen işlemden önceki haliyle temsil eden bir RuleDataSnapshot . |
| $ değişkenler | Kimlikleri ve dinamik alt anahtarları temsil etmek için kullanılan joker karakter yolu. |
| yetki | Kimliği doğrulanmış bir kullanıcının belirteç yükünü temsil eder. |
Bu değişkenler kurallarınızın herhangi bir yerinde kullanılabilir. Örneğin, aşağıdaki güvenlik kuralları /foo/ düğümüne yazılan verilerin 100 karakterden kısa bir dize olmasını sağlar:
{
"rules": {
"foo": {
// /foo is readable by the world
".read": true,
// /foo is writable by the world
".write": true,
// data written to /foo must be a string less than 100 characters
".validate": "newData.isString() && newData.val().length < 100"
}
}
}
Veriye dayalı kurallar
Veritabanınızdaki herhangi bir veri kurallarınızda kullanılabilir. Önceden tanımlanmış root , data ve newData değişkenlerini kullanarak, yazma olayından önce veya sonra var olan herhangi bir yola erişebilirsiniz.
/allow_writes/ düğümünün değeri true olduğu, üst düğümün readOnly bayrağı seti olmadığı ve yeni yazılan verilerde foo adında bir alt öğe olduğu sürece yazma işlemlerine izin veren bu örneği düşünün:
".write": "root.child('allow_writes').val() === true &&
!data.parent().child('readOnly').exists() &&
newData.child('foo').exists()"
Sorgu tabanlı kurallar
Kuralları filtre olarak kullanamasanız da kurallarınızdaki sorgu parametrelerini kullanarak veri alt kümelerine erişimi sınırlayabilirsiniz. query. Sorgu parametrelerine göre okuma veya yazma erişimi vermek için kurallarınızdaki ifadeleri kullanın.
Örneğin, aşağıdaki sorgu tabanlı kural, baskets koleksiyonundaki verilere erişimi yalnızca etkin kullanıcının sahip olduğu alışveriş sepetleriyle kısıtlamak için kullanıcı tabanlı güvenlik kurallarını ve sorgu tabanlı kuralları kullanır:
"baskets": {
".read": "auth.uid !== null &&
query.orderByChild === 'owner' &&
query.equalTo === auth.uid" // restrict basket access to owner of basket
}
Kuraldaki sorgu parametrelerini içeren aşağıdaki sorgu başarılı olacaktır:
db.ref("baskets").orderByChild("owner")
.equalTo(auth.currentUser.uid)
.on("value", cb) // Would succeed
Ancak kuraldaki parametreleri içermeyen sorgular PermissionDenied hatasıyla başarısız olur:
db.ref("baskets").on("value", cb) // Would fail with PermissionDenied
Bir istemcinin okuma işlemleri aracılığıyla indirdiği veri miktarını sınırlamak için sorgu tabanlı kuralları da kullanabilirsiniz.
Örneğin, aşağıdaki kural okuma erişimini öncelik sırasına göre bir sorgunun yalnızca ilk 1000 sonucuyla sınırlandırır:
messages: {
".read": "query.orderByKey &&
query.limitToFirst <= 1000"
}
// Example queries:
db.ref("messages").on("value", cb) // Would fail with PermissionDenied
db.ref("messages").limitToFirst(1000)
.on("value", cb) // Would succeed (default order by key)
Aşağıdaki query. ifadeler Gerçek Zamanlı Veritabanı Güvenlik Kurallarında mevcuttur.
| Sorgu tabanlı kural ifadeleri | ||
|---|---|---|
| İfade | Tip | Tanım |
| query.orderByKey query.orderByPriority query.orderByValue | boolean | Anahtara, önceliğe veya değere göre sıralanan sorgular için doğrudur. Aksi takdirde yanlış. |
| query.orderByChild | sicim hükümsüz | Bir alt düğüme giden göreceli yolu temsil etmek için bir dize kullanın. Örneğin, query.orderByChild === "address/zip" . Sorgu bir alt düğüm tarafından sıralanmazsa bu değer null olur. |
| query.startAt query.endAt query.equalTo | sicim sayı boolean hükümsüz | Yürütülen sorgunun sınırlarını alır veya sınır kümesi yoksa null değerini döndürür. |
| query.limitToFirst query.limitToLast | sayı hükümsüz | Yürütülen sorgunun sınırını alır veya ayarlanan bir sınır yoksa null değerini döndürür. |
Operatörler
Gerçek Zamanlı Veritabanı Kuralları, koşul ifadesindeki değişkenleri birleştirmek için kullanabileceğiniz bir dizi operatörü destekler. Referans belgelerdeki operatörlerin tam listesine bakın.
Koşullar oluşturma
Gerçek koşullarınız, vermek istediğiniz erişime bağlı olarak değişecektir. Kurallar kasıtlı olarak çok büyük bir esneklik sunar; böylece uygulamanızın kuralları sonuçta ihtiyacınız olduğu kadar basit veya karmaşık olabilir.
Basit, üretime hazır Kurallar oluşturmaya yönelik bazı rehberlikler için bkz. Temel Güvenlik Kuralları .