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

Güvenlik Kuralları 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 neler yapabileceği) ile ilgilenen 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 yol tabanlı izinler belirlemenize olanak tanır. Kuralların gelen isteklere 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.

Cloud Firestore

Basit yapı

Cloud Firestore ve Storage'daki Firebase Güvenlik Kuralları aşağıdaki yapı ve sözdizimini kullanır:

 service <<name>> {
  // Match the resource path.
  match <<path>> {
    // Allow the request if the following conditions are true.
    allow <<methods>> : if <<condition>>
  }
}
 

Kuralları oluştururken aşağıdaki temel kavramları anlamak önemlidir:

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

Güvenlik kuralları sürüm 2

Mayıs 2019'dan itibaren Firebase güvenlik kurallarının 2. sürümü kullanıma sunulmuştur. Kuralların 2. sürümü, yinelenen joker karakterlerin {name=**} davranışını değiştirir. Koleksiyon grubu sorgularını kullanmayı planlıyorsanız sürüm 2'yi kullanmanız gerekir. rules_version = '2'; yaparak sürüm 2'ye rules_version = '2'; güvenlik kurallarınızdaki ilk satır:

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

Eşleme yolları

Tüm eşleşme ifadeleri, koleksiyonları değil dokümanları göstermelidir. Eşleşme ifadesi, match /cities/SF gibi belirli bir belgeyi işaret edebilir veya match /cities/{city} olduğu gibi belirtilen yoldaki herhangi bir belgeyi işaret etmek için joker karakterler kullanabilir.

Yukarıdaki örnekte, match ifadesi {city} joker karakter sözdizimini kullanır. Bu, kuralın cities koleksiyonundaki /cities/SF veya /cities/NYC gibi tüm belgeler için geçerli olduğu anlamına gelir. Maç ifadesindeki allow ifadeleri değerlendirildiğinde, city değişkeni, SF veya NYC gibi şehir belgesi adına çözümlenir.

Eşleşen alt toplamalar

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

cities koleksiyonundaki her belgenin bir yer landmarks alt koleksiyonu içerdiği durumu düşünün. Güvenlik kuralları yalnızca eşleşen yolda geçerlidir, bu nedenle cities koleksiyonunda tanımlanan erişim kontrolleri yer landmarks alt toplama için geçerli değildir. Bunun yerine, alt toplamalara 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 setleri 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

Kuralların keyfi olarak derin bir hiyerarşiye uygulanmasını istiyorsanız, yinelenen joker karakter sözdizimini 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 karakter sözdizimini kullanırken, joker karakter değişkeni, belge derin iç içe bir alt toplamada bulunsa bile eşleşen yol parçasının tamamını içerecektir. Örneğin, yukarıda listelenen kurallar /cities/SF/landmarks/coit_tower bulunan bir belgeyle /cities/SF/landmarks/coit_tower ve document değişkeninin değeri SF/landmarks/coit_tower .

Ancak, yinelenen 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, yinelemeli joker karakterler bir veya daha fazla yol öğesiyle eşleşir. Boş bir yolla match /cities/{city}/{document=**} , bu nedenle match /cities/{city}/{document=**} eşleşme, alt toplamalardaki belgeleri eşleştirir ancak cities koleksiyonuyla match /cities/{document=**} ; buna karşılık match /cities/{document=**} , cities toplama ve alt toplamalar.

Özyinelemeli joker karakterler bir maç ifadesinin sonuna gelmelidir.

Versiyon 2

Güvenlik kurallarının 2. sürümünde, yinelenen joker karakterler sıfır veya daha fazla yol öğesiyle eşleşir. match/cities/{city}/{document=**} herhangi bir alt toplamadaki dokümanlarla ve cities koleksiyonundaki dokümanlarla eşleşir.

rules_version = '2'; ekleyerek sürüm 2'ye rules_version = '2'; güvenlik kurallarınızın ü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>;
    }
  }
}
 

Maç başına en fazla bir özyinelemeli joker karaktere sahip olabilirsiniz, ancak sürüm 2'de bu joker karakteri maç bildiriminde herhangi bir yere 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>;
    }
  }
}
 

Koleksiyon grubu sorguları kullanıyorsanız, sürüm 2'yi kullanmanız gerekir; toplama grubu sorgularını koruma konusuna bakın.

Çakışan maç ifadeleri

Bir belgenin birden fazla match ifadesiyle eşleşmesi mümkündür. Birden fazla allow ifadesinin bir istekle eşleşmesi durumunda, koşullardan herhangi biri true erişime izin verilir:

 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, cities kurallarına yapılan tüm okuma ve yazma işlemlerine izin verilecektir çünkü ikinci kural her zaman true , ancak birinci kural her zaman false .

Güvenlik kuralı sınırları

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

limit ayrıntılar
İstek başına maksimum exists() , get() ve getAfter() çağrısı sayısı
  • 10 tek belge istekleri ve sorgu istekleri için.
  • 20 çoklu belge okumaları, işlemleri ve toplu yazma işlemleri için. Önceki işlem sınırı, her işlem için de geçerlidir.

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

Bu sınırlardan herhangi birinin aşılması, izin reddedildi hatasıyla sonuçlanır.

Bazı belge erişim çağrıları önbelleğe alınabilir ve önbellek çağrıları sınırlara dahil edilmez.

Maksimum iç içe match deyimi derinliği 10
Bir dizi iç içe match ifadesinde izin verilen yol bölümlerinde maksimum yol uzunluğu 100
Bir dizi iç içe match ifadesinde izin verilen maksimum yol yakalama değişkeni sayısı 20
Maksimum işlev çağrı derinliği 20
Maksimum işlev bağımsız değişkeni sayısı 7
İşlev başına maksimum let değişken bağlama sayısı 10
Maksimum özyinelemeli veya döngüsel işlev çağrısı sayısı 0 (izin verilmiyor)
İstek başına değerlendirilen maksimum ifade sayısı 1.000
Kural kümesinin maksimum boyutu Verax kural kümeleri iki boyut sınırına uymalıdır:
  • firebase deploy konsolundan veya firebase deploy kullanılarak yayınlanan Verax kural firebase deploy metin kaynağının boyutu için 256 KB'lık bir sınırlama.
  • Firebase Verax kaynağını işlediğinde ve arka uçta etkinleştirdiğinde derlenen kural kümesinin boyutunda 250 KB'lık bir sınırlama.

Bulut depolama

Basit yapı

Cloud Firestore ve Storage'daki Firebase Güvenlik Kuralları aşağıdaki yapı ve sözdizimini kullanır:

 service <<name>> {
  // Match the resource path.
  match <<path>> {
    // Allow the request if the following conditions are true.
    allow <<methods>> : if <<condition>>
  }
}
 

Kuralları oluştururken aşağıdaki temel kavramları anlamak önemlidir:

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

Eşleme yolları

Depolama Güvenliği Kuralları, Cloud Storage'daki dosyalara erişmek için kullanılan dosya yollarıyla match . Kurallar tam yollarla veya joker karakter yollarıyla match ve kurallar da iç içe yerleştirilebilir. Hiçbir eşleşme kuralı bir istek yöntemine izin vermezse veya koşul false değerlendirilirse, 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, joker karakterleri kullanarak bir kalıbı match için de kullanılabilir. Joker karakter, profilePhoto.png gibi tek bir dizeyi veya images/profilePhoto.png gibi birden çok yol parçasını temsil eden adlandırılmış bir değişkendir.

Joker karakter adının etrafına {string} gibi süslü ayraçlar eklenerek bir joker karakter oluşturulur. {path=**} gibi joker karakter adına =** eklenerek birden çok segmentli bir joker karakter bildirilebilir:

// 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. Yani, dosyayla eşleşen herhangi bir kural true değerini değerlendirirse, sonuç true .

Yukarıdaki kurallarda, condition veya other_condition doğru olarak değerlendirilirse "images / other_condition " dosyası other_condition , "images / users / user: 12345 / other_condition " dosyası yalnızca other_condition sonucuna other_condition .

Bir joker değişkene, dosya adı veya yol yetkilendirmesi sağlayan match içinden başvurulabilir:

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

Depolama Güvenliği Kuralları art arda sıralanmaz ve kurallar yalnızca istek yolu belirtilen kurallarla bir yolla eşleştiğinde değerlendirilir.

Değerlendirme iste

Yüklemeler, indirmeler, meta veri değişiklikleri ve silme işlemleri Cloud Storage'a gönderilen request kullanılarak değerlendirilir. request değişkeni, request gerçekleştirildiği dosya yolunu, isteğin alındığı zamanı ve isteğin bir yazma olması durumunda yeni resource değerini içerir. HTTP üstbilgileri ve kimlik doğrulama durumu da dahildir.

request nesnesi ayrıca, request.auth nesnesindeki kullanıcının benzersiz kimliğini ve Firebase Kimlik Doğrulaması yükünü içerir; bu, belgelerin Kullanıcı Tabanlı Güvenlik bölümünde daha ayrıntılı olarak açıklanır.

request nesnesindeki özelliklerin tam listesi aşağıdadır:

Emlak tip Açıklama
auth map <string, string> Bir kullanıcı oturum açtığında, Firebase Kimlik Doğrulama JWT'nin bir haritası için uid , kullanıcının benzersiz kimliği ve token . Aksi takdirde, null olacaktır.
params map <string, string> İsteğin sorgu parametrelerini içeren harita.
path yol İsteğin gerçekleştirildiği path temsil eden bir yol.
resource map <string, string> Yalnızca write isteklerinde bulunan yeni kaynak değeri.
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ğerlendirmek isteyebilirsiniz. Bu, yalnızca belirli içerik türlerine sahip dosyaların yüklenmesine izin vermek veya yalnızca belirli bir boyuttan daha büyük dosyaların silinmesine izin vermek gibi karmaşık ve güçlü kurallar oluşturmanıza olanak tanır.

Cloud Storage için Firebase Güvenlik Kuralları, resource nesnede, bir Cloud Storage nesnesinde ortaya çıkan meta verilerin anahtar / değer çiftlerini içeren dosya meta verileri sağlar. Bu özellikler, veri bütünlüğünü sağlamak için read veya write isteklerinde incelenebilir.

write isteklerinde (yüklemeler, meta veri güncellemeleri ve silmeler gibi), şu anda istek yolunda bulunan dosya için dosya meta verilerini içeren resource nesnesine ek olarak, request.resource nesnesini kullanma olanağınız da vardır. yazma izin verilirse yazılacak meta 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ı zorunlu kılmak için bu iki değeri kullanabilirsiniz.

resource nesnedeki özelliklerin tam listesi aşağıdadır:

Emlak tip Açıklama
name sicim Nesnenin tam adı
bucket sicim Bu nesnenin bulunduğu bölümün adı.
generation int Bu nesnenin GCS nesne üretimi .
metageneration int Bu nesnenin GCS nesnesi metagenerasyonu .
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ı gösteren bir zaman damgası.
md5Hash sicim Nesnenin MD5 karması.
crc32c sicim Nesnenin bir crc32c karması.
etag sicim Bu nesneyle ilişkili etag.
contentDisposition sicim Bu nesneyle ilişkili içerik düzenlemesi.
contentEncoding sicim Bu nesneyle ilişkilendirilen içerik kodlaması.
contentLanguage sicim Bu nesneyle ilişkilendirilmiş içerik dili.
contentType sicim Bu nesneyle ilişkilendirilen içerik türü.
metadata map <string, string> 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 kuralların tam bir örneğini 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.
  • İstek: Bunlar, kuralın erişim vermek için kullandığı yöntemlerdir. read ve write kuralları geniş okuma ve yazma erişimi sağlarken, validate kuralları gelen veya mevcut verilere dayalı erişim sağlamak için ikincil doğrulama görevi görür.
  • Koşul: Bir istek doğru olarak değerlendirilirse izin veren koşul.

Kurallar yollara nasıl uygulanır?

Gerçek Zamanlı Veritabanı'nda Kurallar, atomik olarak uygulanır; başka bir deyişle, daha üst düzey üst düğümlerdeki kurallar, daha ayrıntılı alt düğümlerdeki kuralları geçersiz kılar ve daha derin bir düğümdeki kurallar, üst yola erişim izni veremez. Üst yollardan biri için önceden verdiyseniz, veritabanı yapınızdaki daha derin bir yoldaki erişimi hassaslaştıramaz 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ı, /bar/ /foo/ değeri true olan bir alt baz içerdiğinde /bar/ /foo/ okunmasına izin verir. /foo/bar/ altındaki ".read": false kuralının etkisi yoktur, çünkü erişim bir alt yol tarafından iptal edilemez.

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 çaba ile uygulanmasına izin verir. Bu özellikle kullanıcı tabanlı güvenlik için kullanışlıdır.

Ancak, .validate kuralları basamaklandırılmaz. Yazmaya izin verilebilmesi için tüm geçerlilik kuralları hiyerarşinin tüm düzeylerinde yerine getirilmelidir.

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

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

Kuralların atomik olarak değerlendirildiğini anlamadan, /records/ yolun getirilmesi rec1 döndürür ancak rec2 döndürmez gibi 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
});
Objective-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
}];
hızlı
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İNLENME
curl https://docs-examples.firebaseio.com/rest/records/
# response returns a PERMISSION_DENIED error

/records/ okuma işlemi atomik olduğundan ve /records/ altındaki tüm verilere erişim izni veren bir okuma kuralı olmadığından, bu bir PERMISSION_DENIED hatası verir. Bu kuralı Firebase konsolumuzdaki güvenlik simülatöründe değerlendirirsek, okuma işleminin reddedildiğini görebiliriz:

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

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

Hiçbir okuma kuralı /records/ yola erişime izin vermediği için işlem reddedildi, ancak rec1 kuralının istediğimiz yolda olmadığı için hiçbir zaman değerlendirilmediğine dikkat edin. rec1 getirmek için doğrudan rec1 gerekir:

JavaScript
var db = firebase.database();
db.ref("records/rec1").once("value", function(snap) {
  // SUCCESS!
}, function(err) {
  // error callback is not called
});
Objective-C
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[ref child:@"records/rec1"] observeSingleEventOfType:FEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
    // SUCCESS!
}];
hızlı
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İNLENME
curl https://docs-examples.firebaseio.com/rest/records/rec1
# SUCCESS!

Konum değişkeni

Gerçek Zamanlı Veritabanı Kuralları, yol parçalarını eşleştirmek için $location değişkenini destekler. Kuralınızı yoldaki alt düğümlerle eşleştirmek için yol segmentinizin önündeki $ önekini kullanın.

   {
    "rules": {
      "rooms": {
        // This rule applies to any child of /rooms/, the key for each room id
        // is stored inside $room_id variable for reference
        "$room_id": {
          "topic": {
            // The room's topic can be changed if the room id has "public" in it
            ".write": "$room_id.contains('public')"
          }
        }
      }
    }
  }
 

$variable sabit yol adlarına paralel olarak da kullanabilirsiniz.

   {
    "rules": {
      "widget": {
        // a widget can have a title or color attribute
        "title": { ".validate": true },
        "color": { ".validate": true },

        // but no other child paths are allowed
        // in this case, $other means any key excluding "title" and "color"
        "$other": { ".validate": false }
      }
    }
  }