Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Güvenlik Kuralları dili

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Firebase Güvenlik Kuralları, çok çeşitli karmaşıklığı ve ayrıntı düzeyini destekleyen esnek, güçlü, özel dillerden yararlanır. Kurallarınızı uygulamanız için anlamlı olduğu kadar spesifik 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ı, CEL üzerinde match ve koşullu olarak verilen erişimi destekleyen deyimlere allow Ortak İfade Dili'ni (CEL) temel alan bir dil kullanır.

Ancak bunlar özel diller olduğundan, 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 anahtar kavramları anlamanız ö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: Bir URI yolu olarak temsil edilen veritabanı veya depolama konumu.
  • Kural: Doğru olarak değerlendirilirse bir isteğe izin veren bir koşulu içeren allow ifadesi.

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 anahtar kavramları anlamanız ö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: Bir URI yolu olarak temsil edilen veritabanı veya depolama konumu.
  • Kural: Doğru olarak değerlendirilirse bir isteğe izin veren bir koşulu içeren allow ifadesi.

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 vermek için ikincil bir doğrulama görevi görür.
  • Koşul: Doğru olarak değerlendirilirse bir isteğe izin veren koşul.

Kural yapıları

Bulut Firestore

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

  • service beyanı: Kuralların geçerli olduğu Firebase ürününü beyan eder.
  • match bloğu: Kuralların uygulanacağı veritabanında veya depolama paketinde bir yol tanımlar.
  • allow ifadesi: Yöntemlere göre farklılaştırılmış erişim izni vermek için koşullar sağlar. Desteklenen yöntemler şunları içerir: get , list , create , update , delete ve read ve write kolaylık yöntemleri.
  • İsteğe bağlı function bildirimleri: Birden çok kural arasında kullanım için koşulları birleştirme ve sarma yeteneği sağlayın.

service , isteklere erişim sağlayan koşullar sağlayan allow deyimleriyle bir veya daha fazla match bloğu içerir. request ve resource değişkenleri, kural koşullarında kullanım için mevcuttur. Firebase Güvenlik Kuralları dili, 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 {
...
}

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 (gelen request.path ) yolu ile eşleşen bir path kalıbı bildirir. match match , allow deyimlerine veya function bildirimlerine sahip olmalıdır. Yuvalanmış match bloklarındaki yol, üst match bloğundaki yola göredir.

path kalıbı, değişkenler veya joker karakterler içerebilen dizin benzeri bir addır. path modeli, tek yollu segment ve çok yollu segment eşleşmelerine izin verir. 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 düzeniyle eşleşmeler kısmi veya tam olabilir:

  • Kısmi eşleşmeler: path kalıbı, request.path öğesinin önek eşleşmesidir.
  • Tam eşleşmeler: path kalıbı, request.path tamamı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ş herhangi bir path eşleşmeyi tamamlayıp tamamlamayacağını görmek için iç içe match kuralları 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 verirse, isteğe izin verilir. Eşleşen hiç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 parçalı joker karakter: Bir joker değişken, bir değişkeni küme parantezleri içine alarak bir yolda bildirilir: {variable} . Bu değişkene, match ifadesi içinde bir string olarak erişilebilir.
  • Özyinelemeli joker karakter: Özyinelemeli veya çok segmentli joker karakter, bir yolda veya altındaki birden çok yol kesimiyle eşleşir. Bu joker karakter, ayarladığınız konumun altındaki tüm yollarla eşleşir. Bunu, segment değişkeninizin sonuna =** dizesini ekleyerek bildirebilirsiniz: {variable=**} . Bu değişkene, match ifadesi içinde bir path nesnesi olarak erişilebilir.

İzin vermek

match bloğu bir veya daha fazla allow ifadesi içerir. Bunlar sizin gerçek kurallarınız. İzin verme kurallarını bir veya allow fazla yönteme uygulayabilirsiniz. Bir allow deyimindeki koşullar, Cloud Firestore veya Cloud Storage'ın gelen herhangi bir isteği kabul etmesi için doğru olarak değerlendirilmelidir. Ayrıca, koşulsuz olarak allow deyimleri de yazabilirsiniz, örneğin allow read . Ancak allow ifadesi bir koşul içermiyorsa, her zaman o yöntem için isteğe 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 verirse, Kurallar erişim verir ve erişimi sınırlayabilecek 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 yazmayı isteyen kullanıcının dosyaya sahip olması ve dosyanın bir PNG olması durumunda yazma işlemlerine izin verir. Önceki kural buna izin verdiği için, bir kullanıcı alt yoldaki herhangi bir dosyayı - PNG olmasalar bile - 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 sağlayan 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 Sorgular ve koleksiyonlar için okuma istekleri
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, kural kümenizde yeniden kullanabileceğiniz işlevlerdeki koşul kümelerini 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ü yürütemezler veya harici hizmetleri çağıramazlar.
  • Fonksiyonlar, tanımlandıkları kapsamdaki fonksiyonlara ve değişkenlere otomatik olarak erişebilir. Örneğin, service cloud.firestore kapsamında tanımlanan bir işlevin resource değişkenine ve get() ve entity() gibi yerleşik işlevlere erişimi exists() .
  • Fonksiyonlar diğer fonksiyonları çağırabilir ancak tekrarlamayabilir. Toplam çağrı yığını derinliği 20 ile sınırlıdır.
  • Kurallar sürüm v2 işlevler, let anahtar sözcüğünü kullanarak değişkenleri tanımlayabilir. İşlevlerin en fazla 10 let bağlaması olabilir, ancak bir return ifadesi ile 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 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();
    }
  }
}

İşte fonksiyon 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, admins koleksiyonunun aranmasını nasıl uyguladığına dikkat edin. Gereksiz aramalar gerektirmeden tembel değerlendirme için && (AND) ve || (VEYA) karşılaştırmaları, yalnızca isAuthor doğru ( && karşılaştırmaları için) veya yanlış ( || karşılaştırmaları için) olarak gösterilmesi durumunda ikinci bir işlev çağırmak için.

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ızda 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 aşağıdaki gibidir:

  • service beyanı: Kuralların geçerli olduğu Firebase ürününü beyan eder.
  • match bloğu: Kuralların uygulanacağı veritabanında veya depolama paketinde bir yol tanımlar.
  • allow ifadesi: Yöntemlere göre farklılaştırılmış erişim izni vermek için koşullar sağlar. Desteklenen yöntemler şunları içerir: get , list , create , update , delete ve read ve write kolaylık yöntemleri.
  • İsteğe bağlı function bildirimleri: Birden çok kural arasında kullanım için koşulları birleştirme ve sarma yeteneği sağlayın.

service , isteklere erişim sağlayan koşullar sağlayan allow deyimleriyle bir veya daha fazla match bloğu içerir. request ve resource değişkenleri, kural koşullarında kullanım için mevcuttur. Firebase Güvenlik Kuralları dili, 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 {
...
}

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 (gelen request.path ) yolu ile eşleşen bir path kalıbı bildirir. match match , allow deyimlerine veya function bildirimlerine sahip olmalıdır. Yuvalanmış match bloklarındaki yol, üst match bloğundaki yola göredir.

path kalıbı, değişkenler veya joker karakterler içerebilen dizin benzeri bir addır. path modeli, tek yollu segment ve çok yollu segment eşleşmelerine izin verir. 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 düzeniyle eşleşmeler kısmi veya tam olabilir:

  • Kısmi eşleşmeler: path kalıbı, request.path öğesinin önek eşleşmesidir.
  • Tam eşleşmeler: path kalıbı, request.path tamamı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ş herhangi bir path eşleşmeyi tamamlayıp tamamlamayacağını görmek için iç içe match kuralları 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 verirse, isteğe izin verilir. Eşleşen hiç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 parçalı joker karakter: Bir joker değişken, bir değişkeni küme parantezleri içine alarak bir yolda bildirilir: {variable} . Bu değişkene, match ifadesi içinde bir string olarak erişilebilir.
  • Özyinelemeli joker karakter: Özyinelemeli veya çok segmentli joker karakter, bir yolda veya altındaki birden çok yol kesimiyle eşleşir. Bu joker karakter, ayarladığınız konumun altındaki tüm yollarla eşleşir. Bunu, segment değişkeninizin sonuna =** dizesini ekleyerek bildirebilirsiniz: {variable=**} . Bu değişkene, match ifadesi içinde bir path nesnesi olarak erişilebilir.

İzin vermek

match bloğu bir veya daha fazla allow ifadesi içerir. Bunlar sizin gerçek kurallarınız. İzin verme kurallarını bir veya allow fazla yönteme uygulayabilirsiniz. Bir allow deyimindeki koşullar, Cloud Firestore veya Cloud Storage'ın gelen herhangi bir isteği kabul etmesi için doğru olarak değerlendirilmelidir. Ayrıca, koşulsuz olarak allow deyimleri de yazabilirsiniz, örneğin allow read . Ancak allow ifadesi bir koşul içermiyorsa, her zaman o yöntem için isteğe 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 verirse, Kurallar erişim verir ve erişimi sınırlayabilecek 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 yazmayı isteyen kullanıcının dosyaya sahip olması ve dosyanın bir PNG olması durumunda yazma işlemlerine izin verir. Önceki kural buna izin verdiği için, bir kullanıcı alt yoldaki herhangi bir dosyayı - PNG olmasalar bile - 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 sağlayan 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 Sorgular ve koleksiyonlar için okuma istekleri
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, kural kümenizde yeniden kullanabileceğiniz işlevlerdeki koşul kümelerini 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ü yürütemezler veya harici hizmetleri çağıramazlar.
  • Fonksiyonlar, tanımlandıkları kapsamdaki fonksiyonlara ve değişkenlere otomatik olarak erişebilir. Örneğin, service cloud.firestore kapsamında tanımlanan bir işlevin resource değişkenine ve get() ve entity() gibi yerleşik işlevlere erişimi exists() .
  • Fonksiyonlar diğer fonksiyonları çağırabilir ancak tekrarlamayabilir. Toplam çağrı yığını derinliği 20 ile sınırlıdır.
  • Kurallar sürüm v2 işlevler, let anahtar sözcüğünü kullanarak değişkenleri tanımlayabilir. İşlevlerin en fazla 10 let bağlaması olabilir, ancak bir return ifadesi ile 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 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();
    }
  }
}

İşte fonksiyon 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, admins koleksiyonunun aranmasını nasıl uyguladığına dikkat edin. Gereksiz aramalar gerektirmeden tembel değerlendirme için && (AND) ve || (VEYA) karşılaştırmaları, yalnızca isAuthor doğru ( && karşılaştırmaları için) veya yanlış ( || karşılaştırmaları için) olarak gösterilmesi durumunda ikinci bir işlev çağırmak için.

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ızda 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 özetlendiğ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 sağlayan 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 kesimlerini eşleştirmek için bir $location değişkenini destekler. Kuralınızı yol boyunca herhangi bir alt düğümle 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ı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

Realtime Database'de üç tür kural vardır. Bu kural türlerinden ikisi - read ve write - gelen bir isteğin yöntemine uygulanır. Doğrulama kuralı türü, veri yapılarını zorlar ve verilerin biçimini ve içeriğini validate . 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
.okuman 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 izin verildiğ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ı

Bulut Firestore

Bir 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 ilgili bilgileri içerir:

request.auth

Firebase Authentication'dan gelen kimlik doğrulama bilgilerini içeren bir JSON Web Simgesi (JWT). auth belirteci, bir dizi standart talep ve Firebase Authentication aracılığıyla oluşturduğunuz tüm özel talepleri içerir. Firebase Güvenlik Kuralları ve Kimlik Doğrulama 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 okunur standart yöntemler için geçerli olan yazma kurallarını basitleştirmek için de mevcuttur.

request.params

request.params , özellikle request.resource ile ilgili olmayan ve değerlendirme için faydalı olabilecek tüm verileri içerir. Pratikte, bu harita tüm standart yöntemler için boş olmalı ve özel yöntemler için kaynak olmayan verileri içermelidir. Servisler, params olarak sunulan anahtar ve değerlerin herhangi birinin türünü değiştirmemeye veya yeniden adlandırmamaya dikkat etmelidir.

request.path

request.path , hedef resource yoludur. Yol hizmete göredir. / gibi url güvenli olmayan karakterler içeren yol segmentleri url ile kodlanmıştır.

resource değişkeni

resource , anahtar/değer çiftlerinin bir haritası olarak temsil edilen hizmet içindeki geçerli değerdir. Bir koşul içinde resource başvurmak, hizmetten gelen değerin en fazla bir kez okunmasıyla sonuçlanır. Bu arama, kaynak için hizmetle ilgili tüm kotalara karşı sayılır. get istekleri için, resource yalnızca reddetme kotasına dahil edilir.

Operatörler ve operatör önceliği

Operatörler ve bunların Cloud Firestore ve Cloud Storage Kuralları'ndaki ilgili öncelikleri için aşağıdaki tabloyu referans olarak kullanın.

a ve b rastgele ifadeler, bir f alanı ve bir dizin i .

Şebeke Tanım ilişkilendirme
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ım operatörleri soldan sağa
a+b ab Katkı operatörleri soldan sağa
a>ba>=ba ilişkisel operatörler soldan sağa
a in b Liste veya haritadaki varlığı soldan sağa
a is type Türün bool, int, kayan nokta, 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

Bir 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 ilgili bilgileri içerir:

request.auth

Firebase Authentication'dan gelen kimlik doğrulama bilgilerini içeren bir JSON Web Simgesi (JWT). auth belirteci, bir dizi standart talep ve Firebase Authentication aracılığıyla oluşturduğunuz tüm özel talepleri içerir. Firebase Güvenlik Kuralları ve Kimlik Doğrulama 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 okunur standart yöntemler için geçerli olan yazma kurallarını basitleştirmek için de mevcuttur.

request.params

request.params , özellikle request.resource ile ilgili olmayan ve değerlendirme için faydalı olabilecek tüm verileri içerir. Pratikte, bu harita tüm standart yöntemler için boş olmalı ve özel yöntemler için kaynak olmayan verileri içermelidir. Servisler, params olarak sunulan anahtar ve değerlerin herhangi birinin türünü değiştirmemeye veya yeniden adlandırmamaya dikkat etmelidir.

request.path

request.path , hedef resource yoludur. Yol hizmete göredir. / gibi url güvenli olmayan karakterler içeren yol segmentleri url ile kodlanmıştır.

resource değişkeni

resource , anahtar/değer çiftlerinin bir haritası olarak temsil edilen hizmet içindeki geçerli değerdir. Bir koşul içinde resource başvurmak, hizmetten gelen değerin en fazla bir kez okunmasıyla sonuçlanır. Bu arama, kaynak için hizmetle ilgili tüm kotalara karşı sayılır. get istekleri için, resource yalnızca reddetme kotasına dahil edilir.

Operatörler ve operatör önceliği

Operatörler ve bunların Cloud Firestore ve Cloud Storage Kuralları'ndaki ilgili öncelikleri için aşağıdaki tabloyu referans olarak kullanın.

a ve b rastgele ifadeler, bir f alanı ve bir dizin i .

Şebeke Tanım ilişkilendirme
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ım operatörleri soldan sağa
a+b ab Katkı operatörleri soldan sağa
a>ba>=ba ilişkisel operatörler soldan sağa
a in b Liste veya haritadaki varlığı soldan sağa
a is type Türün bool, int, kayan nokta, 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ı

Bir koşul, belirli bir işleme izin verilip verilmeyeceğini belirleyen bir boole ifadesidir. Bu koşulları Realtime Database Rules içinde 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. İş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 iyi çalışır.
kök Firebase veritabanındaki kök yolu, denenen işlemden önceki haliyle temsil eden bir RuleDataSnapshot.
yeni veri Verileri denenen işlemden sonra var olacaklarını 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 bir joker yol.
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 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"
    }
  }
}

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, bir write olayından önce veya sonra var olan herhangi bir yola erişebilirsiniz.

/allow_writes/ düğümünün değeri true olduğu sürece yazma işlemlerine izin veren bu örneği göz önünde bulundurun, üst düğümün readOnly bayrağı yok ve yeni yazılan verilerde foo adlı bir çocuk var:

".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 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ı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ı olur:

db.ref("baskets").orderByChild("owner")
                 .equalTo(auth.currentUser.uid)
                 .on("value", cb)                 // Would succeed

Ancak, kuraldaki parametreleri içermeyen sorgular bir 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 ne kadar veri indirdiğini sınırlamak için sorgu tabanlı kuralları da kullanabilirsiniz.

Örneğin, aşağıdaki kural, önceliğe göre sıralandığı şekilde, bir sorgunun 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. ifadeler Gerçek Zamanlı Veritabanı Kurallarında mevcuttur.

Sorgu tabanlı kural ifadeleri
İfade Tip Tanım
sorgu.orderByKey
sorgu.orderByPriority
sorgu.orderByValue
boole Anahtar, öncelik veya değere göre sıralanan sorgular için doğrudur. Aksi takdirde yanlış.
sorgu.orderByChild sicim
hükümsüz
Bir alt düğümün göreli yolunu 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.
sorgu.startAt
sorgu.endAt
sorgu.equalTo
sicim
sayı
boole
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.
sorgu.limitToFirst
sorgu.limitToLast
sayı
hükümsüz
Yürütülen sorgudaki 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 ifadesinde değişkenleri birleştirmek için kullanabileceğiniz bir dizi operatörü destekler. Başvuru belgelerindeki operatörlerin tam listesine bakın.

Koşullar yaratmak

Gerçek koşullarınız, vermek istediğiniz erişime göre değişecektir. Kurallar, kasıtlı olarak muazzam derecede esneklik sunar, bu nedenle uygulamanızın kuralları, nihayetinde, olması gerektiği kadar basit veya karmaşık olabilir.

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