Catch up on everthing we announced at this year's Firebase Summit. Learn more

Güvenlik Kuralları dili

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. Bulut Firestore ve Bulut Depolama kuralları temel alan bir dil kullanmak Ortak İfade Dili (CEL) ile CEL üzerine inşa, match ve allow destek şartlı erişim izni olduğu ifadeleri.

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:

  • Talep: yöntemi veya yöntemleri çağrılan allow deyimi. 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ık yöntemi belirtildi veritabanı veya depolama yolunda geniş okuma ve yazma erişimine olanak tanır.
  • Yol: Bir URI yolu olarak temsil veritabanı veya depolama konumu.
  • Kural: allow doğru olarak değerlendirilirse o isteği izin veren bir koşul içeren, deyimi.

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:

  • Talep: yöntemi veya yöntemleri çağrılan allow deyimi. 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ık yöntemi belirtildi veritabanı veya depolama yolunda geniş okuma ve yazma erişimine olanak tanır.
  • Yol: Bir URI yolu olarak temsil veritabanı veya depolama konumu.
  • Kural: allow doğru olarak değerlendirilirse o isteği izin veren bir koşul içeren, 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.
  • Talep: Bunlar kural kullandığı erişim izni yöntemlerdir. read ve write sırasında kuralları, geniş okuma ve yazma erişim izni validate kuralları gelen veya mevcut verilere dayalı hibe erişim için ikinci bir doğrulama olarak hareket ederler.
  • Durumu: Doğru olarak değerlendirilirse o isteği izin koşulu.

Kural yapıları

Bulut Firestore

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

  • service bildirimi: kurallar geçerliyse Firebase ürünü bildirimi yapar.
  • match bloğu: tanımlar kurallar geçerliyse veritabanı veya depolama kova bir yolu.
  • allow yöntemlerle ayırt verilmesi erişim şartlarının, Sağlar: beyanı. Desteklenen yöntemler şunlardır: get , list , create , update , delete ve kolaylık yöntemleri read ve write .
  • Opsiyonel function bildirimleri: Birden çok kural genelinde kullanılmak üzere koşulları birleştirmek ve sarmak için yeteneği sağlayın.

service bir veya daha fazla içeren match ile blokları allow isteklerine erişim izni koşulları sağlamak ifadeleri. request ve resource değişkenleri kural koşullarında kullanım için mevcuttur. Firebase Güvenlik Kuralları dil de destekler function bildirimleri.

sözdizimi sürümü

syntax ifadesi kaynağını yazmak için kullanılan Firebase Kuralları dilinin sürümünü gösterir. Dilin son sürümüdür v2 .

rules_version = '2';
service cloud.firestore {
...
}

Hayır ise rules_version deyim verilir, kurallarınız kullanılarak değerlendirilecektir v1 motoru.

Hizmet

service Firebase ürün veya hizmet, kurallar geçerliyse beyan tanımlar. Yalnızca bir içerebilir service kaynak dosyasının başına beyanı.

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 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 de yol match blokları ana yol olarak görecelidir match bloğu.

path desen değişkenleri veya joker içerebilir bir dizin benzeri adıdır. path desen tek yol parçasının ve çoklu yol parçasını maçları için izin verir. Bir bağlanmış herhangi değişkenler path dahilinde görünür olan match kapsamı veya herhangi yuvalanmış kapsam path bildirildi.

Bir karşılaşmalar path desen kısmi veya tam olabilir:

  • Kısmi maçlar: path desen bir önek maç request.path .
  • Komple maçlar: path deseni tüm maçları request.path .

Tam bir eşleşme olduğu zaman blok içerisindeki kurallar değerlendirilir. Kısmi eşleşme yapıldığında iç içe match kuralları herhangi yuvalanmış olup olmadığını görmek için test edilir path maçı tamamlayacak.

Her komple kurallar match isteğini izin verip vermeyeceğ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.
  }
}

Gösterir, yukarıda bir örnek olarak, path bildirimleri aşağıdaki değişkenleri destekler:

  • Tek kademeli Joker: bir Joker değişken küme parantezi bir değişken sararak bir yol içinde bildirilen {variable} . Bu değişken içinde erişilebilir match bir şekilde açıklamaya string .
  • Yinelemeli Joker: ya da bir yol aşağıdaki yinelemeli veya çok kademeli bir kalıbı stoktaki çoklu yol parçaları. Bu joker karakter, ayarladığınız konumun altındaki tüm yollarla eşleşir. Sen ekleyerek ilan edebilir =** segment değişkeninin sonunda dize: {variable=**} . Bu değişken içinde erişilebilir match bir şekilde açıklamaya path nesnesi.

İzin vermek

match blok bir veya daha fazla içeriyor allow ifadeleri. Bunlar sizin gerçek kurallarınız. Sen başvurabilir allow bir veya daha fazla yöntemlere kurallar. Bir de koşullar allow Bulut Firestore veya Bulut Depolama herhangi bir gelen istek vermek için ifade doğru olarak değerlendirilmelidir. Ayrıca yazma edebilirsiniz allow örneğin, şart olmadan ifadeleri allow read . Eğer allow deyim bir koşul içermez, ancak, her zaman bu yöntem için istek verir.

Herhangi Eğer allow yöntemi için kurallar memnun olan, istek 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 deyimi aynı yöntemin gelen istekleri için erişim veren bir yöntemi de 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

Sen örtüşme aynı yöntemleri okuyamaz match aynı blok veya çakışan yazma yöntemlerine path beyanı.

Ö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:

  • Fonksiyonlar sadece tek içerebilir return deyimi. 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, 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 diğer fonksiyonları çağırabilir ancak tekrarlamayabilir. Toplam çağrı yığını derinliği 20 ile sınırlıdır.
  • Kurallar versiyonu olarak v2 , fonksiyonlar kullanarak değişkenleri tanımlayabilirsiniz let anahtar sözcüğü. İşlevlerin en fazla 10 let bağlaması olabilir, ancak bir return ifadesi ile bitmelidir.

Bir fonksiyon ile tanımlanır function anahtar kelime ve sıfır veya daha fazla bağımsız değişkeni 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;
}

Nasıl Not isAdmin atama yöneticileri koleksiyonunun bir arama zorlar. Gereksiz aramaları gerektirmeden yavaş değerlendirme için, kısa devre doğa yararlanmak && (VE) ve || Yalnızca (OR) karşılaştırmalar ikinci işlevi çağırmak için isAuthor (için de geçerli olduğu görülen && karşılaştırmalar) veya yanlış (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ı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 bildirimi: kurallar geçerliyse Firebase ürünü bildirimi yapar.
  • match bloğu: tanımlar kurallar geçerliyse veritabanı veya depolama kova bir yolu.
  • allow yöntemlerle ayırt verilmesi erişim şartlarının, Sağlar: beyanı. Desteklenen yöntemler şunlardır: get , list , create , update , delete ve kolaylık yöntemleri read ve write .
  • Opsiyonel function bildirimleri: Birden çok kural genelinde kullanılmak üzere koşulları birleştirmek ve sarmak için yeteneği sağlayın.

service bir veya daha fazla içeren match ile blokları allow isteklerine erişim izni koşulları sağlamak ifadeleri. request ve resource değişkenleri kural koşullarında kullanım için mevcuttur. Firebase Güvenlik Kuralları dil de destekler function bildirimleri.

sözdizimi sürümü

syntax ifadesi kaynağını yazmak için kullanılan Firebase Kuralları dilinin sürümünü gösterir. Dilin son sürümüdür v2 .

rules_version = '2';
service cloud.firestore {
...
}

Hayır ise rules_version deyim verilir, kurallarınız kullanılarak değerlendirilecektir v1 motoru.

Hizmet

service Firebase ürün veya hizmet, kurallar geçerliyse beyan tanımlar. Yalnızca bir içerebilir service kaynak dosyasının başına beyanı.

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 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 de yol match blokları ana yol olarak görecelidir match bloğu.

path desen değişkenleri veya joker içerebilir bir dizin benzeri adıdır. path desen tek yol parçasının ve çoklu yol parçasını maçları için izin verir. Bir bağlanmış herhangi değişkenler path dahilinde görünür olan match kapsamı veya herhangi yuvalanmış kapsam path bildirildi.

Bir karşılaşmalar path desen kısmi veya tam olabilir:

  • Kısmi maçlar: path desen bir önek maç request.path .
  • Komple maçlar: path deseni tüm maçları request.path .

Tam bir eşleşme olduğu zaman blok içerisindeki kurallar değerlendirilir. Kısmi eşleşme yapıldığında iç içe match kuralları herhangi yuvalanmış olup olmadığını görmek için test edilir path maçı tamamlayacak.

Her komple kurallar match isteğini izin verip vermeyeceğ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.
  }
}

Gösterir, yukarıda bir örnek olarak, path bildirimleri aşağıdaki değişkenleri destekler:

  • Tek kademeli Joker: bir Joker değişken küme parantezi bir değişken sararak bir yol içinde bildirilen {variable} . Bu değişken içinde erişilebilir match bir şekilde açıklamaya string .
  • Yinelemeli Joker: ya da bir yol aşağıdaki yinelemeli veya çok kademeli bir kalıbı stoktaki çoklu yol parçaları. Bu joker karakter, ayarladığınız konumun altındaki tüm yollarla eşleşir. Sen ekleyerek ilan edebilir =** segment değişkeninin sonunda dize: {variable=**} . Bu değişken içinde erişilebilir match bir şekilde açıklamaya path nesnesi.

İzin vermek

match blok bir veya daha fazla içeriyor allow ifadeleri. Bunlar sizin gerçek kurallarınız. Sen başvurabilir allow bir veya daha fazla yöntemlere kurallar. Bir de koşullar allow Bulut Firestore veya Bulut Depolama herhangi bir gelen istek vermek için ifade doğru olarak değerlendirilmelidir. Ayrıca yazma edebilirsiniz allow örneğin, şart olmadan ifadeleri allow read . Eğer allow deyim bir koşul içermez, ancak, her zaman bu yöntem için istek verir.

Herhangi Eğer allow yöntemi için kurallar memnun olan, istek 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 deyimi aynı yöntemin gelen istekleri için erişim veren bir yöntemi de 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

Sen örtüşme aynı yöntemleri okuyamaz match aynı blok veya çakışan yazma yöntemlerine path beyanı.

Ö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:

  • Fonksiyonlar sadece tek içerebilir return deyimi. 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, 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 diğer fonksiyonları çağırabilir ancak tekrarlamayabilir. Toplam çağrı yığını derinliği 20 ile sınırlıdır.
  • Kurallar versiyonu olarak v2 , fonksiyonlar kullanarak değişkenleri tanımlayabilirsiniz let anahtar sözcüğü. İşlevlerin en fazla 10 let bağlaması olabilir, ancak bir return ifadesi ile bitmelidir.

Bir fonksiyon ile tanımlanır function anahtar kelime ve sıfır veya daha fazla bağımsız değişkeni 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;
}

Nasıl Not isAdmin atama yöneticileri koleksiyonunun bir arama zorlar. Gereksiz aramaları gerektirmeden yavaş değerlendirme için, kısa devre doğa yararlanmak && (VE) ve || Yalnızca (OR) karşılaştırmalar ikinci işlevi çağırmak için isAuthor (için de geçerli olduğu görülen && karşılaştırmalar) veya yanlış (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ı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()"
        }
      }
    }
  }

Gösterileri Yukarıdaki örnekte olduğu gibi, Gerçek Zamanlı Veri Tabanı Kurallar destekleyen $location yol parçalarını eşleşecek şekilde değişken. Kullan $ yolu boyunca herhangi bir çocuk bezlerine Kuralınızı uyacak şekilde yol parçasının önünde önek.

  {
    "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')"
          }
        }
      }
    }
  }

Ayrıca kullanabilirsiniz $variable sabit yol adları ile paralel.

  {
    "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 İki - read ve write - Gelen bir istek yöntemine uygulanır. validate kural türü veri yapılarını zorlar ve biçimini ve verinin içeriğini doğrular. Kurallar çalıştırmak .validate bir doğruladıktan sonra kuralları .write kural erişim izni verir.

Kural Türleri
.okuman Verilerin kullanıcılar tarafından okunmasına izin verilip verilmediğini ve ne zaman izin verildiğini açıklar.
.yazı 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şkenler bu koşullar için bağlam sağlar.

request değişkeni

request değişkeni şu alanları ve ilgili bilgileri içerir:

request.auth

Firebase Authentication'dan gelen kimlik doğrulama bilgilerini içeren bir JSON Web Simgesi (JWT). auth standart iddiaları ve Firebase Kimlik Doğrulaması yoluyla oluşturduğunuz özel iddiaların kümesi içerir simge. Hakkında daha fazla bilgi Firebase Güvenlik Kuralları ve Kimlik Doğrulama .

request.method

request.method standart yöntemler ya da özel bir yöntemin herhangi biri olabilir. Kolaylık yöntemleri read ve write da sırasıyla tüm salt okunur veya tüm salt standart yöntemlere uygulanacak kuralları yazma basitleştirmek için vardır.

request.params

request.params özel olarak ilgili olmayan herhangi bir veri içerir request.resource değerlendirme için yararlı olabilir. 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 için yoludur resource . Yol hizmete göredir. Gibi olmayan url güvenli karakterleri içeren Yol parçaları / url kodlanmış bulunmaktadır.

resource değişken

resource Anahtar değer çiftleri haritasında olarak temsil hizmeti içinde mevcut bir değerdir. Başvuruda resource koşulu içinde hizmetinden değerin okunan en az birini sonuçlanacaktır. Bu arama, kaynak için hizmetle ilgili tüm kotalara karşı sayılır. İçin get istekleri, resource yalnızca inkar üzerine kotamda edecektir.

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.

Keyfi ifadeler göz önüne alındığında a ve b , bir saha f , ve bir dizin i .

Şebeke Açıklama 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 karşılaştırma, nerede type bool, int, float sayı, dize, liste, harita, zaman damgası, süre, yol veya olabilir latlng 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şkenler bu koşullar için bağlam sağlar.

request değişkeni

request değişkeni şu alanları ve ilgili bilgileri içerir:

request.auth

Firebase Authentication'dan gelen kimlik doğrulama bilgilerini içeren bir JSON Web Simgesi (JWT). auth standart iddiaları ve Firebase Kimlik Doğrulaması yoluyla oluşturduğunuz özel iddiaların kümesi içerir simge. Hakkında daha fazla bilgi Firebase Güvenlik Kuralları ve Kimlik Doğrulama .

request.method

request.method standart yöntemler ya da özel bir yöntemin herhangi biri olabilir. Kolaylık yöntemleri read ve write da sırasıyla tüm salt okunur veya tüm salt standart yöntemlere uygulanacak kuralları yazma basitleştirmek için vardır.

request.params

request.params özel olarak ilgili olmayan herhangi bir veri içerir request.resource değerlendirme için yararlı olabilir. 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 için yoludur resource . Yol hizmete göredir. Gibi olmayan url güvenli karakterleri içeren Yol parçaları / url kodlanmış bulunmaktadır.

resource değişken

resource Anahtar değer çiftleri haritasında olarak temsil hizmeti içinde mevcut bir değerdir. Başvuruda resource koşulu içinde hizmetinden değerin okunan en az birini sonuçlanacaktır. Bu arama, kaynak için hizmetle ilgili tüm kotalara karşı sayılır. İçin get istekleri, resource yalnızca inkar üzerine kotamda edecektir.

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.

Keyfi ifadeler göz önüne alındığında a ve b , bir saha f , ve bir dizin i .

Şebeke Açıklama 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 karşılaştırma, nerede type bool, int, float sayı, dize, liste, harita, zaman damgası, süre, yol veya olabilir latlng 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 Bir RuleDataSnapshot o teşebbüs ameliyattan önce var olduğu Firebase veritabanında kök yolunu temsil eder.
yeni veri Bir RuleDataSnapshot bu teşebbüs operasyon sonrası mevcut gibi verileri temsil eder. Yazılmakta olan yeni verileri ve mevcut verileri içerir.
veri Bir RuleDataSnapshot o teşebbüs operasyon önce var gibi verileri temsil eder.
$ 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, güvenlik kuralları aşağıda yazılan veri sağlamak /foo/ düğüm 100 karakterden az bir dize olmalıdır:

{
  "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ış değişkenler kullanarak root , data ve newData , bunu önce veya yazma olaydan sonra mevcut gibi herhangi yoluna erişebilir.

Sürece yazma işlemleri sağlayan bu örneği var sayalım değeri olarak /allow_writes/ düğümdür true bir yok üst düğüm readOnly bayrağı seti ve adında bir çocuk var foo yeni yazılmış verilerdeki:

".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. Kullanım 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 kullanan kullanıcı tabanlı güvenlik kurallarını verilere erişimi kısıtlamak için ve sorgu tabanlı kurallar baskets aktif kullanıcının sahip tek alışveriş sepetleri için koleksiyon:

"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, kural parametrelerini içermiyor sorguları ile başarısız olur PermissionDenied hata:

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 Açıklama
sorgu.orderByKey
sorgu.orderByPriority
sorgu.orderByValue
boole Anahtar, öncelik veya değere göre sıralanan sorgular için geçerlidir. Aksi takdirde yanlış.
sorgu.orderByChild sicim
boş
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
boş
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ı
boş
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ı bir dizi destek operatörler Eğer koşul deyiminde değişkenleri birleştirmek için kullanabilirsiniz. Tam listesine bakın referans belgelerinde operatörler .

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.

Bazı rehberlik oluşturarak basit için, üretime hazır Kurallar, bkz Temel Güvenlik Kuralları .