Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Güvenlik Kuralları dili

Firebase Güvenlik Kuralları, çok çeşitli karmaşıklık ve ayrıntı düzeyini destekleyen esnek, güçlü, özel dillerden yararlanır. Kurallarınızı uygulamanız için anlamlı veya genel yapabilirsiniz. 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 Dilini (CEL) temel alan bir dil kullanır.

Ancak bunlar özel diller olduğundan bir öğrenme eğrisi vardır. Daha karmaşık kurallara daha derinlemesine bakarken Kural 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ı

Cloud Firestore

Cloud Firestore ve Storage'daki Firebase Güvenlik Kuralları aşağıdaki yapı 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ı anlamak önemlidir:

  • İstek: allow deyiminde çağrılan yöntem veya yöntemler. Bunlar, çalıştırmanıza izin verdiğiniz yöntemlerdir. Standart yöntemler şunlardır: get , list , create , update ve delete . read ve write kolaylığı yöntemleri, belirtilen veritabanı veya depolama yolunda geniş okuma ve yazma erişimi sağlar.
  • Yol: URI yolu olarak gösterilen veritabanı veya depolama konumu.
  • Kural: Bir istek doğru olarak değerlendirilirse izin veren bir koşul içeren allow deyimi.

Bu kavramların her biri aşağıda daha ayrıntılı olarak açıklanmaktadır.

Bulut depolama

Cloud Firestore ve Storage'daki Firebase Güvenlik Kuralları aşağıdaki yapı 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ı anlamak önemlidir:

  • İstek: allow deyiminde çağrılan yöntem veya yöntemler. Bunlar, çalıştırmanıza izin verdiğiniz yöntemlerdir. Standart yöntemler şunlardır: get , list , create , update ve delete . read ve write kolaylığı yöntemleri, belirtilen veritabanı veya depolama yolunda geniş okuma ve yazma erişimi sağlar.
  • Yol: URI yolu olarak gösterilen veritabanı veya depolama konumu.
  • Kural: Bir istek doğru olarak değerlendirilirse izin veren bir koşul içeren allow deyimi.

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 bulunan 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 vardır:

  • Yol: Veritabanı konumu. Bu, veritabanınızın JSON yapısını yansıtır.
  • İstek: Bunlar, kuralın erişim vermek için kullandığı yöntemlerdir. read ve write kuralları geniş okuma ve yazma erişimi sağlarken, validate kuralları gelen veya mevcut verilere dayalı erişim sağlamak için ikincil doğrulama görevi görür.
  • Koşul: Bir istek doğru olarak değerlendirilirse izin veren koşul.

Kural yapıları

Cloud Firestore

Cloud Firestore ve Cloud Storage'daki bir kuralın temel öğeleri şunlardır:

  • service bildirimi: Kuralların uygulanacağı Firebase ürününü bildirir.
  • match bloğu: Veritabanında veya depolama grubunda kuralların uygulanacağı yolu tanımlar.
  • allow ifadesi: Erişim izni vermek için, yöntemlerle farklılaştırılmış koşullar sağlar. Desteklenen yöntemler şunlardır: get , list , create , update , delete ve kolaylık yöntemleri read ve write .
  • İsteğe bağlı function bildirimleri: Birden çok kuralda kullanmak için koşulları birleştirme ve sarma yeteneği sağlar.

service , isteklere erişim izni veren koşullar sağlayan allow ifadelerine sahip bir veya daha fazla match bloğu içeriyor. request ve resource değişkenleri kural koşullarında kullanılabilir. Firebase Güvenlik Kuralları dili de function bildirimlerini destekler.

Sözdizimi sürümü

syntax deyimi, 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 {
...
}
 

Herhangi bir rules_version ifadesi sağlanmazsa, kurallarınız v1 motoru kullanılarak değerlendirilir.

Hizmet

service bildirimi, kurallarınızın hangi Firebase ürününe veya hizmetine uygulanacağını tanımlar. Kaynak dosya başına yalnızca bir service bildirimi ekleyebilirsiniz.

Cloud Firestore

 service cloud.firestore {
 // Your 'match' blocks with their corresponding 'allow' statements and
 // optional 'function' declarations are contained here
}
 

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 Depolama için kurallar tanımıyorsanız, bunları ayrı dosyalarda tutmanız gerekir.

Eşleşme

Bir match bloğu beyan path istenen işlem için yola karşılaştırıldıkça deseni (gelen request.path ). Vücut match bir veya daha fazla iç içe olmalıdır match , bloklar allow ifadeleri veya function bildirimleri. İç içe match bloklarındaki yol, üst match bloğundaki yola göredir.

path deseni, değişkenler veya joker karakterler içerebilen dizin benzeri bir addır. path deseni, tek yollu segment ve çok yollu segment eşleşmelerine izin verir. Bir path bağlı olan değişkenler, match kapsamı içinde veya path bildirildiği herhangi bir iç içe kapsamda görülebilir.

Bir path desenine karşı eşleşmeler kısmi veya tam olabilir:

  • Kısmi eşleşmeler: path deseni, request.path öğesinin önek eşleşmesidir.
  • Tam eşleşmeler: path düzeni, tüm request.path eşleşir.

Tam bir eşleşme yapıldığında, blok içindeki kurallar değerlendirilir. Kısmi eşleme yapıldığında, iç içe match kuralları, 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. Eşleşen kurallardan herhangi birine erişim izni verilirse, isteğe izin verilir. Hiçbir eşleşme kuralı erişim izni vermezse, 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 parçalı joker karakter: Joker değişken değişkeni, bir değişkeni küme parantezlerine sarılarak bir yol olarak bildirilir: {variable} . Bu değişken, match deyimi içinde bir string olarak erişilebilir.
  • Yinelemeli joker karakter: Yinelemeli veya çok parçalı joker karakter, bir yoldaki veya altındaki birden çok yol segmentiyle 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 bildirebilirsiniz: {variable=**} . Bu değişken, match deyimi içinde bir path nesnesi olarak erişilebilir.

İzin vermek

match bloğu bir veya daha fazla allow ifadesi içeriyor. Bunlar gerçek kurallarınız. Bir veya daha fazla yönteme allow kuralları uygulayabilirsiniz. Bir de koşullar allow Bulut Firestore veya Depolama herhangi bir gelen istek vermek için ifade doğru olarak değerlendirilmelidir. Ayrıca koşulsuz allow ifadeleri de yazabilirsiniz, örneğin allow read . allow deyimi bir koşul içermiyorsa, her zaman bu yöntemin isteğine izin verir.

Yöntem için allow kurallarından herhangi biri karşılanırsa, isteğe izin verilir. Ayrıca, daha geniş bir kural erişim izni verirse, Kurallar erişim izni verir ve erişimi kısıtlayabilecek daha ayrıntılı kuralları yok sayar.

Herhangi bir kullanıcının kendi dosyalarından herhangi birini okuyabileceği veya silebileceğ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 ve dosya bir PNG ise yazma işlemlerine izin verir. Bir kullanıcı PNG'den olmasa bile alt yoldaki dosyaları silebilir, çünkü önceki kural buna izin verir.

 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 deyimi, aynı yöntemin gelen istekleri için erişim sağlayan bir yöntem içerir.

Yöntem İstek tipi
Kolaylık yöntemleri
read Her türlü okuma talebi
write Her türlü yazma talebi
Standart yöntemler
get Tek belge veya dosya isteklerini okuma
list Sorgu ve koleksiyon isteklerini okuma
create Yeni belge veya dosya yazma
update Mevcut belgelere veya dosyalara yazma
delete Verileri sil

Aynı match bloğundaki okuma yöntemlerini veya aynı path bildirimindeki çakışan yazma yöntemlerini çakışamazsı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 unauthenticated 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";
    }
  }
}
 

fonksiyon

Güvenlik kurallarınız daha karmaşık hale geldikçe, kural kümenizde yeniden kullanabileceğiniz işlevlerde koşul kümelerini sarmak isteyebilirsiniz. Güvenlik kuralları özel işlevleri destekler. Özel işlevlerin sözdizimi biraz JavaScript gibidir, 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. Ek mantık içeremezler. Örneğin, döngüler gerçekleştiremez veya harici hizmetleri çağıramazlar.
  • İşlevler, işlevlere ve değişkenlere tanımlandıkları kapsamdan otomatik olarak erişebilir. Örneğin, içinde tanımlanmış bir işlev service cloud.firestore kapsamı erişimi olan resource değişken ve yerleşik işlevleri gibi get() ve exists() .
  • Fonksiyonlar başka fonksiyonlar çağırabilir, ancak geri çekilemez. Toplam çağrı yığını derinliği 20 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 10 taneye kadar izinli bağlama içerebilir, 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 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();
    }
  }
}
 

İşlev argümanlarını ve izin atamalarını gösteren bir örnek. 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, yöneticiler koleksiyonunun bir aramasını nasıl isAdmin unutmayın. Gereksiz aramalara ihtiyaç duymadan tembel değerlendirme için, && (AND) ve || (VEYA), yalnızca isAuthor true ( && karşılaştırmaları için) veya false ( || karşılaştırmaları için) olarak gösterilmesi durumunda ikinci bir işlevi çağırmak için karşılaştırmalar.

 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şlevleri kullanmak, kurallarınızın karmaşıklığı arttıkça onları daha sürdürülebilir hale getirir.

Bulut depolama

Cloud Firestore ve Cloud Storage'daki bir kuralın temel öğeleri şunlardır:

  • service bildirimi: Kuralların uygulanacağı Firebase ürününü bildirir.
  • match bloğu: Veritabanında veya depolama grubunda kuralların uygulanacağı yolu tanımlar.
  • allow ifadesi: Erişim izni vermek için yöntemlerle farklılaştırılmış koşullar sağlar. Desteklenen yöntemler şunlardır: get , list , create , update , delete ve kolaylık yöntemleri read ve write .
  • İsteğe bağlı function bildirimleri: Birden çok kuralda kullanmak için koşulları birleştirme ve sarma yeteneği sağlar.

service , isteklere erişim izni veren koşullar sağlayan allow ifadelerine sahip bir veya daha fazla match bloğu içeriyor. request ve resource değişkenleri kural koşullarında kullanılabilir. Firebase Güvenlik Kuralları dili de function bildirimlerini destekler.

Sözdizimi sürümü

syntax deyimi, 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 {
...
}
 

Herhangi bir rules_version ifadesi sağlanmazsa, kurallarınız v1 motoru kullanılarak değerlendirilir.

Hizmet

service bildirimi, kurallarınızın hangi Firebase ürününe veya hizmetine uygulanacağını tanımlar. Kaynak dosya başına yalnızca bir service bildirimi ekleyebilirsiniz.

Cloud Firestore

 service cloud.firestore {
 // Your 'match' blocks with their corresponding 'allow' statements and
 // optional 'function' declarations are contained here
}
 

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 Depolama için kurallar tanımıyorsanız, bunları ayrı dosyalarda tutmanız gerekir.

Eşleşme

Bir match bloğu beyan path istenen işlem için yola karşılaştırıldıkça deseni (gelen request.path ). Vücut match bir veya daha fazla iç içe olmalıdır match , bloklar allow ifadeleri veya function bildirimleri. İç içe match bloklarındaki yol, üst match bloğundaki yola göredir.

path deseni, değişkenler veya joker karakterler içerebilen dizin benzeri bir addır. path deseni, tek yollu segment ve çok yollu segment eşleşmelerine izin verir. Bir path bağlı olan değişkenler, match kapsamı içinde veya path bildirildiği herhangi bir iç içe kapsamda görülebilir.

Bir path desenine karşı eşleşmeler kısmi veya tam olabilir:

  • Kısmi eşleşmeler: path deseni, request.path öğesinin önek eşleşmesidir.
  • Tam eşleşmeler: path düzeni, tüm request.path eşleşir. path .

Tam bir eşleşme yapıldığında, blok içindeki kurallar değerlendirilir. Kısmi eşleme yapıldığında, iç içe match kuralları, 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. Eşleşen herhangi bir kural erişim izni veriyorsa, isteğe izin verilir. Hiçbir eşleşme kuralı erişim izni vermezse, 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 parçalı joker karakter: Bir değişken, küme parantezlerine bir değişken sarılarak yol içinde bildirilir: {variable} . Bu değişken, match deyimi içinde bir string olarak erişilebilir.
  • Yinelemeli joker karakter: Yinelemeli veya çok parçalı joker karakter, bir yoldaki veya altındaki birden çok yol segmentiyle 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 bildirebilirsiniz: {variable=**} . Bu değişken, match deyimi içinde bir path nesnesi olarak erişilebilir.

İzin vermek

match bloğu bir veya daha fazla allow ifadesi içeriyor. Bunlar gerçek kurallarınız. Bir veya daha fazla yönteme allow kuralları uygulayabilirsiniz. Bir de koşullar allow Bulut Firestore veya Depolama herhangi bir gelen istek vermek için ifade doğru olarak değerlendirilmelidir. Ayrıca koşulsuz allow ifadeleri de yazabilirsiniz, örneğin, allow read . allow deyimi bir koşul içermiyorsa, her zaman bu yöntemin isteğine izin verir.

Yöntem için allow kurallarından herhangi biri karşılanırsa, isteğe izin verilir. Ayrıca, daha geniş bir kural erişim izni verirse, Kurallar erişim izni verir ve erişimi kısıtlayabilecek daha ayrıntılı kuralları yok sayar.

Herhangi bir kullanıcının kendi dosyalarından herhangi birini okuyabileceği veya silebileceğ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 ve dosya bir PNG ise yazma işlemlerine izin verir. Bir kullanıcı PNG'den olmasa bile alt yoldaki dosyaları silebilir, çünkü önceki kural izin verir.

 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 deyimi, aynı yöntemin gelen istekleri için erişim sağlayan bir yöntem içerir.

Yöntem İstek tipi
Kolaylık yöntemleri
read Her türlü okuma talebi
write Her türlü yazma talebi
Standart yöntemler
get Tek belge veya dosya isteklerini okuma
list Sorgu ve koleksiyon isteklerini okuma
create Yeni belge veya dosya yazma
update Mevcut belgelere veya dosyalara yazma
delete Verileri sil

Aynı match bloğundaki okuma yöntemlerini veya aynı path bildirimindeki çakışan yazma yöntemlerini çakışamazsı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 unauthenticated 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";
    }
  }
}
 

fonksiyon

Güvenlik kurallarınız daha karmaşık hale geldikçe, kural kümenizde yeniden kullanabileceğiniz işlevlerde koşul kümelerini sarmak isteyebilirsiniz. Güvenlik kuralları özel işlevleri destekler. Özel işlevlerin sözdizimi biraz JavaScript gibidir, 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. Ek mantık içeremezler. Örneğin, döngüler gerçekleştiremez veya harici hizmetleri çağıramazlar.
  • İşlevler, işlevlere ve değişkenlere tanımlandıkları kapsamdan otomatik olarak erişebilir. Örneğin, içinde tanımlanmış bir işlev service cloud.firestore kapsamı erişimi olan resource değişken ve yerleşik işlevleri gibi get() ve exists() .
  • Fonksiyonlar başka fonksiyonlar çağırabilir, ancak geri çekilemez. Toplam çağrı yığını derinliği 20 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 10 taneye kadar izinli bağlama içerebilir, 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 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();
    }
  }
}
 

İşlev argümanlarını ve izin atamalarını gösteren bir örnek. 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, yöneticiler koleksiyonunun bir aramasını nasıl isAdmin unutmayın. Gereksiz aramalara ihtiyaç duymadan tembel değerlendirme için, && (AND) ve || (VEYA), yalnızca isAuthor true ( && karşılaştırmaları için) veya false ( || karşılaştırmaları için) olarak gösterilmesi durumunda ikinci bir işlevi çağırmak için karşılaştırmalar.

 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şlevleri kullanmak, kurallarınızın karmaşıklığı arttıkça onları daha sürdürülebilir hale getirir.

Gerçek Zamanlı Veritabanı

Yukarıda belirtildiği gibi, Gerçek Zamanlı Veritabanı Kuralları üç temel öğe içerir: veritabanının JSON yapısının bir yansıması olarak veritabanı konumu, istek türü ve erişim izni koşulu.

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 listesinin bulunduğu bir sohbet uygulamasında, şuna benzer 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 parçalarıyla eşleşmek için bir $location değişkenini destekler. Kuralınızı yoldaki alt düğümlerle eşleştirmek için yol segmentinizin önündeki $ ö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ına 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öntemi için geçerlidir. validate kuralı türü, veri yapılarını zorlar ve verilerin biçimini ve içeriğini doğrular. Bir .write kuralının erişim izni .write doğruladıktan sonra kurallar .validate kurallarını çalıştırır.

Kural Türleri
.read 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 verilmediğini ve ne zaman girileceğini açıklar.
.validate 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.

Bina koşulları

Cloud Firestore

Koşul, belirli bir işleme izin verilip verilmeyeceğ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 karşılık gelen bilgileri içerir:

request.auth

Firebase Kimlik Doğrulamasından kimlik doğrulama bilgilerini içeren bir JSON Web Simgesi (JWT). auth token, bir dizi standart hak talebi ve Firebase Kimlik Doğrulaması yoluyla oluşturduğunuz özel hak taleplerini 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. Ayrıca sırasıyla salt okunur veya salt okunur standart yöntemlerin tümüne uygulanan yazma kurallarını basitleştirmek için read ve write kolaylığı yöntemleri de mevcuttur.

request.params

request.params , değerlendirme için yararlı olabilecek request.resource ile özellikle ilgili olmayan verileri içerir. Uygulamada, bu harita tüm standart yöntemler için boş olmalı ve özel yöntemler için kaynak dışı veriler içermelidir. Hizmetler, parametre olarak sunulan anahtar ve değerlerin türlerini yeniden adlandırmamaya veya değiştirmemeye dikkat etmelidir.

request.path

request.path , hedef resource yoludur. Yol, hizmete göredir. / Gibi URL olmayan güvenli karakterler içeren yol segmentleri url olarak kodlanır.

resource değişkeni

resource , anahtar / değer çiftlerinin haritası olarak temsil edilen hizmet içindeki geçerli değerdir. Bir koşuldaki resource başvurusu, hizmetten en fazla bir değer okunmasına neden olur. Bu arama, kaynakla ilgili hizmetle ilgili tüm kotalara karşılık gelir. get istekleri için, resource yalnızca reddedildiğinde kotaya dahil edilir.

Operatörler ve operatör önceliği

Aşağıdaki tabloyu operatörler ve Cloud Firestore ve Storage Kuralları içindeki ilgili öncelikleri için referans olarak kullanın.

Rasgele a ve b ifadeleri, bir alan f ve bir indeks i verildiğinde.

Şebeke Açıklama Birleşim
a[i] a() af Dizin, çağrı, saha erişimi soldan sağa
!a -a Tekli olumsuzlama sağdan sola
a/ba%ba*b Çarpımsal operatörler soldan sağa
a+b ab Katkı operatörleri soldan sağa
a>b a>=b a<b a<=b İlişkisel operatörler soldan sağa
a in b , a is b Liste veya haritadaki varlık, tür 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 verilip verilmeyeceğ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 karşılık gelen bilgileri içerir:

request.auth

Firebase Kimlik Doğrulamasından kimlik doğrulama bilgilerini içeren bir JSON Web Simgesi (JWT). auth token, bir dizi standart hak talebi ve Firebase Kimlik Doğrulaması yoluyla oluşturduğunuz özel hak taleplerini 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. Ayrıca sırasıyla salt okunur veya salt okunur standart yöntemlerin tümüne uygulanan yazma kurallarını basitleştirmek için read ve write kolaylığı yöntemleri de mevcuttur.

request.params

request.params , değerlendirme için yararlı olabilecek request.resource ile özellikle ilgili olmayan verileri içerir. Uygulamada, bu harita tüm standart yöntemler için boş olmalı ve özel yöntemler için kaynak dışı veriler içermelidir. Hizmetler, parametre olarak sunulan anahtar ve değerlerin türlerini yeniden adlandırmamaya veya değiştirmemeye dikkat etmelidir.

request.path

request.path , hedef resource yoludur. Yol, hizmete göredir. / Gibi URL olmayan güvenli karakterler içeren yol segmentleri url olarak kodlanır.

resource değişkeni

resource , anahtar / değer çiftlerinin haritası olarak temsil edilen hizmet içindeki geçerli değerdir. Bir koşuldaki resource başvurusu, hizmetten en fazla bir değer okunmasına neden olur. Bu arama, kaynakla ilgili hizmetle ilgili tüm kotalara karşılık gelir. get istekleri için, resource yalnızca reddedildiğinde kotaya dahil edilir.

Operatörler ve operatör önceliği

Aşağıdaki tabloyu operatörler ve Cloud Firestore ve Storage Kuralları içindeki ilgili öncelikleri için referans olarak kullanın.

Rasgele a ve b ifadeleri, bir alan f ve bir indeks i verildiğinde.

Şebeke Açıklama Birleşim
a[i] a() af Dizin, çağrı, saha erişimi soldan sağa
!a -a Tekli olumsuzlama sağdan sola
a/ba%ba*b Çarpımsal operatörler soldan sağa
a+b ab Katkı operatörleri soldan sağa
a>b a>=b a<b a<=b İlişkisel operatörler soldan sağa
a in b , a is b Liste veya haritadaki varlık, tür 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 verilip verilmeyeceğini belirleyen bir boole ifadesidir. Bu koşulları Gerçek Zamanlı Veritabanı Kuralları'nda aşağıdaki şekillerde tanımlayabilirsiniz.

Önceden tanımlanmış değişkenler

Bir kural tanımı içinde erişilebilen bir dizi yardımcı, önceden tanımlanmış değişken vardır. Her birinin kısa bir özeti:

Önceden Tanımlanmış Değişkenler
şimdi Linux döneminden bu yana geçen milisaniye cinsinden zaman. Bu, SDK'nın firebase.database.ServerValue.TIMESTAMP ile oluşturulan zaman damgalarını doğrulamak için özellikle iyi çalışır.
kök Denemeden önce Firebase veritabanındaki kök yolunu temsil eden bir RuleDataSnapshot .
yeni veri Verileri, denenen işlemden sonra varlığını temsil eden bir RuleDataSnapshot . Yazılan yeni verileri ve mevcut verileri içerir.
veri Deneme işleminden önce verileri temsil eden bir RuleDataSnapshot .
$ değişkenler Kimlikleri ve dinamik alt anahtarları temsil etmek için kullanılan joker yol.
auth Kimliği doğrulanmış bir kullanıcının simge yükünü temsil eder.

Bu değişkenler kurallarınızda herhangi bir yerde kullanılabilir. Örneğin, aşağıdaki güvenlik kuralları /foo/ düğümüne yazılan verilerin 100 karakterden az 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"
    }
  }
}

Veri tabanlı kurallar

Veritabanınızdaki tüm veriler kurallarınızda kullanılabilir. root , data ve newData ön tanımlı değişkenlerini kullanarak, bir yazma olayından önce veya sonra var olan herhangi bir yola erişebilirsiniz.

/allow_writes/ node değeri true olduğu sürece, üst düğümde bir readOnly bayrağı ayarlanmadığı ve yeni yazılan verilerde foo adında bir alt readOnly 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. kullan query. sorgu parametrelerine dayalı okuma veya yazma erişimi vermek için kurallarınızdaki ifadeler.

Ö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 sınırlamak için kullanıcı tabanlı güvenlik kuralları 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ı olur:

 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
 

Ayrıca, istemcinin okuma işlemleri yoluyla ne kadar veri indireceğini sınırlamak için sorgu tabanlı kurallar da kullanabilirsiniz.

Örneğin, aşağıdaki kural, bir sorgunun öncelik sırasına göre sıralandığı şekilde yalnızca ilk 1000 sonucuna okuma erişimini sınırlar:

 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. ifadeleri Gerçek Zamanlı Veritabanı Kurallarında mevcuttur.

Sorgu tabanlı kural ifadeleri
ifade tip Açıklama
query.orderByKey
query.orderByPriority
query.orderByValue
boole Anahtar, öncelik veya değere göre sıralanan sorgular için geçerlidir. Aksi takdirde yanlış.
query.orderByChild sicim
boş
Bir alt düğüme göreli yolu temsil etmek için bir dize kullanın. Örneğin, query.orderByChild == "address/zip" . Sorgu bir alt düğüm tarafından sipariş edilmezse, bu değer null olur.
query.startAt
query.endAt
query.equalTo
sicim
numara
boole
boş
Yürütülen sorgunun sınırlarını alır veya ayarlanmış bir sınır yoksa null değerini döndürür.
query.limitToFirst
query.limitToLast
numara
boş
Yürütme sorgusundaki sınırı alır veya ayarlanmış 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 işleci destekler. Referans belgelerindeki 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şir. Kurallar bilerek büyük ölçüde esneklik sunar, böylece uygulamanızın kuralları nihayetinde olması gerektiği kadar basit veya karmaşık olabilir.

Basit, üretime hazır Kurallar oluşturma konusunda bazı yönergeler için bkz. Temel Güvenlik Kuralları .