Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Güvenlik Kuralları nasıl çalışır?

Güvenlik, uygulama geliştirme bulmacasının en karmaşık parçalarından biri olabilir. Çoğu uygulamada geliştiriciler, kimlik doğrulama (kullanıcının kim olduğu) ve yetkilendirme (kullanıcının yapabilecekleri) işlemlerini gerçekleştiren bir sunucu oluşturmalı ve çalıştırmalıdır.

Firebase Güvenlik Kuralları, orta (sunucu) katmanı kaldırır ve verilerinize doğrudan bağlanan istemciler için yola dayalı izinler belirlemenize olanak tanır. Gelen isteklere kuralların nasıl uygulandığı hakkında daha fazla bilgi edinmek için bu kılavuzu kullanın.

Kuralları hakkında daha fazla bilgi edinmek için bir ürün seçin.

Bulut Firestore

Basit yapı

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.

Güvenlik kuralları sürüm 2

Mayıs 2019 itibarıyla, Firebase güvenlik kurallarının 2. sürümü kullanıma sunulmuştur. Kurallar, Version 2 davranışını değiştirir özyinelemeli joker {name=**} . Kullanmak planlıyorsanız sürüm 2'yi kullanmanız gerekir toplama grubu sorguları . Sen dahil olunmalıdır sürümüne 2'ye yaparak rules_version = '2'; güvenlik kurallarınızdaki ilk satır:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

Eşleşen yollar

Tüm eşleşme ifadeleri koleksiyonları değil belgeleri göstermelidir. Bir maç açıklamada olduğu gibi, belirli bir belgeye işaret edebilir match /cities/SF olduğu gibi belirtilen yolunda herhangi bir belgeye noktasına veya kullanım joker karakterler match /cities/{city} .

Yukarıdaki örnekte, maç deyimi kullanır {city} joker sözdizimi. Kural herhangi bir belgeye de geçerlidir Bu araçlar cities koleksiyonu gibi /cities/SF veya /cities/NYC . Ne zaman allow maç açıklamada ifadeler değerlendirilir, city değişken gibi şehir belge adı da çözecektir SF veya NYC .

Eşleşen alt koleksiyonlar

Cloud Firestore'daki veriler, belge koleksiyonları halinde düzenlenir ve her belge, hiyerarşiyi alt koleksiyonlar aracılığıyla genişletebilir. Güvenlik kurallarının hiyerarşik verilerle nasıl etkileşime girdiğini anlamak önemlidir.

Her belge durumu ele alalım cities koleksiyonunda bir içerdiği landmarks subcollection. Üzerinde tanımlı erişim kontrolleri böylece Güvenlik kuralları, yalnızca eşleşen yolda uygulamak cities koleksiyonu için geçerli olmayan landmarks subcollection. Bunun yerine, alt koleksiyonlara erişimi kontrol etmek için açık kurallar yazın:

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      allow read, write: if <condition>;

      // Explicitly define rules for the 'landmarks' subcollection
      match /landmarks/{landmark} {
        allow read, write: if <condition>;
      }
    }
  }
}

Yuva yaparken match ifadeleri, iç yolu match deyimi daima dış yoluna akrabası match açıklamada. Bu nedenle aşağıdaki kural kümeleri eşdeğerdir:

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      match /landmarks/{landmark} {
        allow read, write: if <condition>;
      }
    }
  }
}
service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city}/landmarks/{landmark} {
      allow read, write: if <condition>;
    }
  }
}

özyinelemeli joker karakterler

Eğer kurallar bir keyfi derin hiyerarşiye uygulamak istiyorsanız, özyinelemeli joker sözdizimi kullanın {name=**} :

service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the cities collection as well as any document
    // in a subcollection.
    match /cities/{document=**} {
      allow read, write: if <condition>;
    }
  }
}

Özyinelemeli joker sözdizimini kullanırken, joker karakter değişkeni, belge derinlemesine iç içe geçmiş bir alt koleksiyonda bulunsa bile eşleşen yol bölümünün tamamını içerecektir. Örneğin, yukarıda sıralanan kurallar bulunan bir belgeyi eşleşir /cities/SF/landmarks/coit_tower ve değeri document değişkeni olacaktır SF/landmarks/coit_tower .

Ancak yinelemeli joker karakterlerin davranışının kural sürümüne bağlı olduğunu unutmayın.

Versiyon 1

Güvenlik kuralları varsayılan olarak sürüm 1'i kullanır. Sürüm 1'de, özyinelemeli joker karakterler bir veya daha fazla yol öğesiyle eşleşir. Böylece Onlar, boş bir yol eşleşmeyen match /cities/{city}/{document=**} subcollections belgeleri ile eşleşen ancak içinde cities koleksiyonu, oysa match /cities/{document=**} hem belgeleri maçları cities toplanması ve alt koleksiyondan.

Özyinelemeli joker karakterler, bir eşleşme ifadesinin sonunda gelmelidir.

Versiyon 2

Güvenlik kurallarının 2. versiyonunda, özyinelemeli joker karakterler sıfır veya daha fazla yol öğesiyle eşleşir. match/cities/{city}/{document=**} herhangi subcollections yanı sıra belgelerde belgeleri ile eşleşen cities koleksiyonu.

Sen dahil olunmalıdır sürüm 2 ekleyerek rules_version = '2'; güvenlik kurallarınızın en üstünde:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the cities collection as well as any document
    // in a subcollection.
    match /cities/{city}/{document=**} {
      allow read, write: if <condition>;
    }
  }
}

Her eşleşme ifadesi için en fazla bir özyinelemeli joker karakteriniz olabilir, ancak sürüm 2'de bu joker karakteri eşleşme ifadesinin herhangi bir yerine yerleştirebilirsiniz. Örneğin:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the songs collection group
    match /{path=**}/songs/{song} {
      allow read, write: if <condition>;
    }
  }
}

Eğer kullanırsanız toplama grubu sorguları , sen sürüm 2 kullanın görmek gerekir toplama grubu sorguları güvence .

Çakışan eşleşme ifadeleri

Bir belge birden fazla maç için olması mümkündür match deyimi. Birden durumda allow ifadeler bir istekle eşleşen, erişim koşullardan herhangi eğer izin verilir true :

service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the 'cities' collection.
    match /cities/{city} {
      allow read, write: if false;
    }

    // Matches any document in the 'cities' collection or subcollections.
    match /cities/{document=**} {
      allow read, write: if true;
    }
  }
}

Yukarıdaki örnekte, tüm okur ve yazma işlemleri cities ikinci kural her zaman olduğundan koleksiyon izin verilecek true ilk kural her zaman olmasına rağmen false .

Güvenlik kuralı sınırları

Güvenlik kurallarıyla çalışırken aşağıdaki sınırlara dikkat edin:

sınır Detaylar
Maksimum sayısı exists() , get() ve getAfter() istek başına çağrıları
  • Tek belge istekleri ve sorgu istekleri için 10.
  • Çoklu belge okumaları, işlemler ve toplu yazma işlemleri için 20. Her işlem için önceki 10 sınırı da geçerlidir.

    Örneğin, 3 yazma işlemiyle toplu bir yazma isteği oluşturduğunuzu ve güvenlik kurallarınızın her bir yazmayı doğrulamak için 2 belge erişim çağrısı kullandığını hayal edin. Bu durumda, her yazma 10 erişim çağrısından 2'sini kullanır ve toplu yazma isteği, 20 erişim çağrısından 6'sını kullanır.

Her iki sınırın da aşılması, izin reddedildi hatasıyla sonuçlanır.

Bazı belge erişim aramaları önbelleğe alınabilir ve önbelleğe alınan aramalar sınırlara dahil edilmez.

Maksimum iç içe match deyimi derinliği 10
İç içe bir dizi içinde izin yolu segmentlerinde Maksimum yol uzunluğu, match ifadeleri 100
Yol yakalama değişkenlerin maksimum sayısı iç içe bir dizi içinde izin match ifadeleri 20
Maksimum işlev çağrısı derinliği 20
Maksimum işlev bağımsız değişkeni sayısı 7
Maksimum sayıda let işlevi başına değişken bağlamaları 10
Maksimum özyinelemeli veya döngüsel işlev çağrısı sayısı 0 (izin verilmez)
İstek başına değerlendirilen maksimum ifade sayısı 1.000
Bir kural kümesinin maksimum boyutu Kural kümeleri iki boyut sınırına uymalıdır:
  • Firebase konsolundan kullanılarak veya CLI yayınlanan kural takımı metin kaynağının boyutuna 256 KB sınırı firebase deploy .
  • Firebase kaynağı işlediğinde ve arka uçta aktif hale getirdiğinde ortaya çıkan, derlenmiş kural kümesi boyutunda 250 KB'lik bir sınır.

Bulut depolama

Basit yapı

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.

Eşleşen yollar

Bulut Depolama Güvenliği Kuralları match Bulut Depolama erişim dosyaları için kullanılan dosya yollarını. Kurallar edebilirsiniz match tam yolları veya joker yolları ve kuralları da iç içe geçebilir. Eşleşme kuralı bir istek yöntemini, veya koşul değerlendirir izin veriyorsa false , istek reddedilir.

Tam eşleşmeler

// Exact match for "images/profilePhoto.png"
match /images/profilePhoto.png {
  allow write: if <condition>;
}

// Exact match for "images/croppedProfilePhoto.png"
match /images/croppedProfilePhoto.png {
  allow write: if <other_condition>;
}

İç içe eşleşmeler

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/profilePhoto.png"
  match /profilePhoto.png {
    allow write: if <condition>;
  }

  // Exact match for "images/croppedProfilePhoto.png"
  match /croppedProfilePhoto.png {
    allow write: if <other_condition>;
  }
}

Joker karakter eşleşmeleri

Kurallar da kullanılabilir match joker kullanan bir kalıbı. Bir joker ya olduğu gibi tek bir dize temsil adlandırılmış değişkendir profilePhoto.png ya gibi birden yol kesimleri, images/profilePhoto.png .

Bir joker gibi, Joker isimlere etrafında küme parantezi eklenerek oluşturulan {string} . Bir çok kademeli bir Joker eklenerek bildirilebilir =** gibi Joker adı {path=**} :

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/*"
  // e.g. images/profilePhoto.png is matched
  match /{imageId} {
    // This rule only matches a single path segment (*)
    // imageId is a string that contains the specific segment matched
    allow read: if <condition>;
  }

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

Birden fazla kural bir dosya eşleşirse, sonucudur OR tüm kuralları değerlendirmelerin sonucu. Dosya için evalutes eşleşen herhangi bir kural eğer kendisine, true , sonuçtur true .

Ya eğer yukarıdaki kurallara, dosya "images / profilePhoto.png" okunabilir condition veya other_condition sonucuna sadece tabidir: true değerlendirmek dosya "12345 / profilePhoto.png images / kullanıcılar / kullanıcı" iken, other_condition .

Bir joker değişken içinden başvurulabilir match dosya adını veya yol izni sunulmalıdır:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

Bulut Depolama Güvenlik Kuralları basamaklandırılmaz ve kurallar yalnızca istek yolu belirtilen kurallara sahip bir yolla eşleştiğinde değerlendirilir.

Değerlendirme iste

Yüklenen, indirme, meta veri değişiklikleri ve siler kullanılarak değerlendirilir request Cloud Storage gönderdi. request değişken istek alındığında istek, zaman yapılmıyorsa dosya yolunu ve yeni içeren resource istek bir yazma ise değer. HTTP üstbilgileri ve kimlik doğrulama durumu da dahildir.

request nesne, kullanıcının benzersiz bir kimlik ve Firebase Kimlik yükünü içerir request.auth de açıklanacaktır nesnesi kimlik doğrulama dokümanların bölümü.

Mülklerin tam listesi request nesne aşağıda verilmiştir:

Mülk Tip Açıklama
auth harita<dize, dize> Kaydedilir kullanıcı, sağladığında uid , kullanıcının benzersiz bir kimlik ve token Firebase Kimlik JWT iddiaların bir harita. Aksi takdirde olacak null .
params harita<dize, dize> İsteğin sorgu parametrelerini içeren harita.
path yol Bir path talep gerçekleştirilir olan yolu temsil eder.
resource harita<dize, dize> Yeni kaynak değeri, yalnızca mevcut write istekleri.
time zaman damgası İsteğin değerlendirildiği sunucu saatini temsil eden bir zaman damgası.

Kaynak değerlendirmesi

Kuralları değerlendirirken, yüklenen, indirilen, değiştirilen veya silinen dosyanın meta verilerini de değerlendirmek isteyebilirsiniz. Bu, yalnızca belirli içerik türlerine sahip dosyaların yüklenmesine veya yalnızca belirli bir boyuttan büyük dosyaların silinmesine izin vermek gibi şeyler yapan karmaşık ve güçlü kurallar oluşturmanıza olanak tanır.

Bulut Depolama için Firebase Güvenlik Kuralları dosya meta verileri sağlar resource meta anahtar / değer çiftleri bir Cloud Storage nesnesi su yüzüne içeren nesnenin. Bu özellikler üzerinde kontrol edilebilir read veya write veri bütünlüğünü sağlamak için istekleri.

Açık write (örneğin yüklemeler, meta veri güncellemeleri ve siler gibi) istekleri, ek olarak resource şu anda istek yolda, aynı zamanda kullanma yeteneği var var dosya için dosya meta verileri içeren nesne, request.resource nesnesini bu, yazmaya izin veriliyorsa yazılacak dosya meta verilerinin bir alt kümesini içerir. Veri bütünlüğünü sağlamak veya dosya türü veya boyutu gibi uygulama kısıtlamalarını zorlamak için bu iki değeri kullanabilirsiniz.

Mülklerin tam listesi resource nesne aşağıda verilmiştir:

Mülk Tip Açıklama
name sicim Nesnenin tam adı
bucket sicim Bu nesnenin bulunduğu paketin adı.
generation int Google Bulut Depolama nesne nesil bu nesnenin.
metageneration int Google Bulut Depolama nesne metageneration bu nesnenin.
size int Nesnenin bayt cinsinden boyutu.
timeCreated zaman damgası Bir nesnenin oluşturulduğu zamanı temsil eden bir zaman damgası.
updated zaman damgası Bir nesnenin en son güncellendiği zamanı temsil eden bir zaman damgası.
md5Hash sicim Nesnenin bir MD5 karması.
crc32c sicim Nesnenin bir crc32c karması.
etag sicim Bu nesneyle ilişkili etag.
contentDisposition sicim Bu nesneyle ilişkili içerik düzeni.
contentEncoding sicim Bu nesneyle ilişkili içerik kodlaması.
contentLanguage sicim Bu nesneyle ilişkili içerik dili.
contentType sicim Bu nesneyle ilişkili içerik türü.
metadata harita<dize, dize> Ek, geliştirici tarafından belirtilen özel meta verilerin anahtar/değer çiftleri.

request.resource hariç bunların tümünü içeren generation , metageneration , etag , timeCreated ve updated .

Tam Örnek

Hepsini bir araya getirerek, bir görüntü depolama çözümü için tam bir kural örneği oluşturabilirsiniz:

service firebase.storage {
 match /b/{bucket}/o {
   match /images {
     // Cascade read to any image type at any path
     match /{allImages=**} {
       allow read;
     }

     // Allow write files to the path "images/*", subject to the constraints:
     // 1) File is less than 5MB
     // 2) Content type is an image
     // 3) Uploaded content type matches existing content type
     // 4) File name (stored in imageId wildcard variable) is less than 32 characters
     match /{imageId} {
       allow write: if request.resource.size < 5 * 1024 * 1024
                    && request.resource.contentType.matches('image/.*')
                    && request.resource.contentType == resource.contentType
                    && imageId.size() < 32
     }
   }
 }
}

Gerçek Zamanlı Veritabanı

Basit yapı

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.

Kurallar yollara nasıl uygulanır?

Gerçek Zamanlı Veritabanında, Kurallar atomik olarak uygulanır; bu, daha yüksek düzeydeki üst düğümlerdeki kuralların daha ayrıntılı alt düğümlerdeki kuralları geçersiz kıldığı ve daha derin bir düğümdeki kuralların bir üst yola erişim sağlayamayacağı anlamına gelir. Üst yollardan biri için zaten yetki verdiyseniz, veritabanı yapınızdaki daha derin bir yola erişimi iyileştiremez veya iptal edemezsiniz.

Aşağıdaki kuralları göz önünde bulundurun:

{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          // ignored, since read was allowed already
          ".read": false
        }
     }
  }
}

Bu güvenlik yapısı sağlar /bar/ zaman okunacak /foo/ çocuk içeren baz değeri ile true . ".read": false altında kural /foo/bar/ erişim çocuk yolunun tarafından iptal edilemez çünkü burada hiçbir etkisi olmaz.

Hemen sezgisel görünmese de, bu kural dilinin güçlü bir parçasıdır ve çok karmaşık erişim ayrıcalıklarının minimum çabayla uygulanmasına olanak tanır. Bu özellikle yararlıdır kullanıcı tabanlı güvenlik .

Ancak, .validate kurallar kaskad yoktur. Bir yazmaya izin verilebilmesi için tüm doğrulama kurallarının hiyerarşinin tüm seviyelerinde karşılanması gerekir.

Ayrıca, kurallar bir üst yola geri uygulanmadığından, istenen konumda veya erişim sağlayan bir üst konumda bir kural yoksa okuma veya yazma işlemi başarısız olur. Etkilenen her alt yola erişilebilir olsa bile, üst konumda okuma tamamen başarısız olur. Bu yapıyı düşünün:

{
  "rules": {
    "records": {
      "rec1": {
        ".read": true
      },
      "rec2": {
        ".read": false
      }
    }
  }
}

Kurallar atomik değerlendirilmesini anlamakta olmadan, alma gibi gözükebilir /records/ dönecekti yolu rec1 ancak rec2 . Ancak asıl sonuç bir hatadır:

JavaScript
var db = firebase.database();
db.ref("records").once("value", function(snap) {
  // success method is not called
}, function(err) {
  // error callback triggered with PERMISSION_DENIED
});
Amaç-C
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[_ref child:@"records"] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
  // success block is not called
} withCancelBlock:^(NSError * _Nonnull error) {
  // cancel block triggered with PERMISSION_DENIED
}];
Süratli
var ref = FIRDatabase.database().reference()
ref.child("records").observeSingleEventOfType(.Value, withBlock: { snapshot in
    // success block is not called
}, withCancelBlock: { error in
    // cancel block triggered with PERMISSION_DENIED
})
Java
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("records");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    // success method is not called
  }

  @Override
  public void onCancelled(FirebaseError firebaseError) {
    // error callback triggered with PERMISSION_DENIED
  });
});
DİNLENMEK
curl https://docs-examples.firebaseio.com/rest/records/
# response returns a PERMISSION_DENIED error

En okuma işleminden yana /records/ atomik ve altındaki bütün veriye erişim izni verir dair hiçbir okuma kural var /records/ , bu atacağım PERMISSION_DENIED hatası. Bizim güvenlik simülatörde bu kuralı değerlendirmek durumunda Firebase konsolda , biz okuma işlemi reddedildiğini görebilirsiniz:

Attempt to read /records with auth=Success(null)
    /
    /records

No .read rule allowed the operation.
Read was denied.

Hiçbir okuma kuralı erişimine izin olduğundan işlem reddedildi /records/ kural bu yolda, ama kayda rec1 biz istenen yolunda değildi çünkü hiç değerlendirilmemiştir. Getirilemedi rec1 , doğrudan erişmek gerekir:

JavaScript
var db = firebase.database();
db.ref("records/rec1").once("value", function(snap) {
  // SUCCESS!
}, function(err) {
  // error callback is not called
});
Amaç-C
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[ref child:@"records/rec1"] observeSingleEventOfType:FEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
    // SUCCESS!
}];
Süratli
var ref = FIRDatabase.database().reference()
ref.child("records/rec1").observeSingleEventOfType(.Value, withBlock: { snapshot in
    // SUCCESS!
})
Java
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("records/rec1");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    // SUCCESS!
  }

  @Override
  public void onCancelled(FirebaseError firebaseError) {
    // error callback is not called
  }
});
DİNLENMEK
curl https://docs-examples.firebaseio.com/rest/records/rec1
# SUCCESS!

Konum değişkeni

Gerçek zamanlı Veritabanı Kuralları bir destekleyecek $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 }
      }
    }
  }