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 yetkilendirmeyi (kullanıcının yapabilecekleri) işleyen 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.
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 temel kavramları anlamanız önemlidir:
- İstek:
allow
ifadesinde çağrılan yöntem veya yöntemler. Bunlar çalışmasına izin verdiğiniz yöntemlerdir. Standart yöntemler şunlardır:get
,list
,create
,update
vedelete
.read
vewrite
kolaylık yöntemleri, belirtilen veritabanı veya depolama yolunda geniş okuma ve yazma erişimi sağlar. - Yol: 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
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ın 2. sürümü, yinelemeli joker karakterlerin davranışını değiştirir {name=**}
. Koleksiyon grubu sorgularını kullanmayı planlıyorsanız, sürüm 2'yi kullanmalısınız. 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 koleksiyonlara değil belgelere işaret etmelidir. Match deyimi match /cities/SF
olduğu gibi belirli bir belgeye işaret edebilir veya match /cities/{city}
de olduğu gibi, belirtilen yoldaki herhangi bir belgeye işaret etmek için joker karakterler kullanabilir.
Yukarıdaki örnekte, eşleşme ifadesi {city}
joker karakter sözdizimini kullanır. Bu, kuralın /cities/SF
veya /cities/NYC
gibi cities
koleksiyonundaki tüm belgeler için geçerli olduğu anlamına gelir. Match deyimindeki allow
ifadeleri değerlendirildiğinde, city
değişkeni, SF
veya NYC
gibi şehir belgesi adına çözümlenir.
Eşleşen alt koleksiyonlar
Cloud Firestore'daki veriler, belge koleksiyonları halinde düzenlenir ve her belge, alt koleksiyonlar yoluyla hiyerarşiyi genişletebilir. Güvenlik kurallarının hiyerarşik verilerle nasıl etkileşime girdiğini anlamak önemlidir.
cities
koleksiyonundaki her belgenin bir 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, landmarks
alt koleksiyonu için geçerli değildir. 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>;
}
}
}
}
match
deyimlerini iç içe yerleştirirken, iç match
deyiminin yolu her zaman dış match
deyiminin yoluna görelidir. Aşağıdaki kural kümeleri bu nedenle 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, yinelemeli 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, belge derinlemesine iç içe geçmiş bir alt koleksiyonda bulunsa bile joker karakter değişkeni eşleşen yol bölümünün tamamını içerecektir. Örneğin, yukarıda listelenen kurallar /cities/SF/landmarks/coit_tower
konumunda bulunan bir belgeyle eşleşir ve document
değişkeninin değeri SF/landmarks/coit_tower
olur.
Ancak yinelemeli joker karakterlerin davranışının kuralların 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. 1. sürümde, yinelemeli joker karakterler bir veya daha fazla yol öğesiyle eşleşir. Boş bir yolla eşleşmezler, bu nedenle match /cities/{city}/{document=**}
, ancak cities
koleksiyonundaki belgelerle eşleşmezken, /cities/{document=** match /cities/{document=**}
her iki belgeyle de eşleşir cities
koleksiyonu ve alt koleksiyonlar.
Yinelemeli joker karakterler, bir eşleşme bildiriminin sonunda 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 koleksiyondaki belgelerle ve cities
koleksiyonundaki belgelerle eşleşir.
rules_version = '2';
ekleyerek sürüm 2'ye kaydolmalısınız. 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>;
}
}
}
Eşleşme bildirimi başına en fazla bir yinelenen joker karakteriniz olabilir, ancak sürüm 2'de bu joker karakteri eşleşme ifadesinde 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 kullanmalısınız, bkz. toplama grubu sorgularının güvenliğini sağlama .
Çakışan eşleşme ifadeleri
Bir belgenin birden fazla match
deyimiyle eşleşmesi mümkündür. Birden çok 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, ilk kural her zaman true
olsa da ikinci kural her zaman false
olduğundan, cities
koleksiyonuna yapılan tüm okuma ve yazma işlemlerine izin verilecektir.
Güvenlik kuralı sınırları
Güvenlik kurallarıyla çalışırken aşağıdaki sınırlara dikkat edin:
sınır | Detaylar |
---|---|
İstek başına en fazla exists() , get() ve getAfter() çağrısı sayısı |
Her iki sınırın aşılması, izin reddedildi hatasıyla sonuçlanır. Bazı belge erişim çağrıları önbelleğe alınabilir ve önbelleğe alınan çağrılar limitlere dahil edilmez. |
Maksimum iç içe match bildirimi derinliği | 10 |
Bir dizi iç içe geçmiş match ifadesi içinde izin verilen, yol segmentlerinde maksimum yol uzunluğu | 100 |
Bir dizi iç içe geçmiş match ifadesi içinde izin verilen maksimum yol yakalama değişkeni sayısı | 20 |
Maksimum işlev çağrısı 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 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:
|
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 temel kavramları anlamanız önemlidir:
- İstek:
allow
ifadesinde çağrılan yöntem veya yöntemler. Bunlar çalışmasına izin verdiğiniz yöntemlerdir. Standart yöntemler şunlardır:get
,list
,create
,update
vedelete
.read
vewrite
kolaylık yöntemleri, belirtilen veritabanı veya depolama yolunda geniş okuma ve yazma erişimi sağlar. - Yol: 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
deyimi.
Eşleşen yollar
Bulut Depolama Güvenlik Kuralları, Bulut Depolama'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 olabilir. Eşleşme kuralı bir istek yöntemine izin vermiyorsa veya koşul false
olarak 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 karakterler kullanılarak 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.
{string}
gibi, joker karakter adının etrafına kaşlı ayraçlar eklenerek bir joker karakter oluşturulur. Çok segmentli bir joker karakter, {path=**}
gibi, joker karakter adına =**
eklenerek 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 çok kural bir dosyayla eşleşirse sonuç, tüm kural değerlendirmelerinin sonucunun OR
. Diğer bir deyişle, dosyanın eşleştiği herhangi bir kural true
olarak değerlendirilirse sonuç true
olur.
Yukarıdaki kurallarda, "images/profilePhoto.png" dosyası, condition
veya other_condition
biri doğru olarak değerlendirilirse okunabilirken, "images/users/user:12345/profilePhoto.png" dosyası yalnızca other_condition
sonucuna tabidir. .
Dosya adını veya yol yetkilendirmesini sağlayan match
içinden bir joker karakter değişkenine başvurulabilir:
// Another way to restrict the name of a file match /images/{imageId} { allow read: if imageId == "profilePhoto.png"; }
Bulut Depolama Güvenlik Kuralları kademeli değildir ve kurallar yalnızca istek yolu, belirtilen kurallara sahip bir yolla eşleştiğinde değerlendirilir.
Değerlendirme iste
Yüklemeler, indirmeler, meta veri değişiklikleri ve silmeler, Cloud Storage'a gönderilen request
kullanılarak değerlendirilir. request
değişkeni, isteğin gerçekleştirildiği dosya yolunu, isteğin alındığı zamanı ve istek bir yazma ise yeni resource
değerini içerir. HTTP başlıkları ve kimlik doğrulama durumu da dahildir.
request
nesnesi ayrıca, belgelerin Kimlik Doğrulama bölümünde daha ayrıntılı olarak açıklanacak olan request.auth
nesnesinde kullanıcının benzersiz kimliğini ve Firebase Kimlik Doğrulaması yükünü de içerir.
request
nesnesindeki özelliklerin tam listesi aşağıda mevcuttur:
Mülk | Tip | Tanım |
---|---|---|
auth | harita<dize, dizi> | Bir kullanıcı oturum açtığında, kullanıcının benzersiz kimliği olan uid ve Firebase Authentication JWT taleplerinin bir haritası olan token sağlar. Aksi takdirde, null olacaktır. |
params | harita<dize, dizi> | İsteğin sorgu parametrelerini içeren harita. |
path | yol | İsteğin gerçekleştirildiği yolu temsil eden bir path . |
resource | harita<dize, dizi> | Yalnızca write isteklerinde mevcut olan yeni kaynak değeri. |
time | zaman damgası | İsteğin değerlendirildiği sunucu zamanını temsil eden bir zaman damgası. |
kaynak değerlendirmesi
Kuralları değerlendirirken, karşıya 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.
Cloud Storage için Firebase Güvenlik Kuralları, bir Cloud Storage nesnesinde ortaya çıkan meta verilerin anahtar/değer çiftlerini içeren resource
nesnesinde 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), istek yolunda mevcut dosya için dosya meta verilerini içeren resource
nesnesine ek olarak request.resource
nesnesini de kullanabilirsiniz. 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ı uygulamak için bu iki değeri kullanabilirsiniz.
resource
nesnesindeki özelliklerin tam listesi aşağıda mevcuttur:
Mülk | Tip | Tanım |
---|---|---|
name | sicim | Nesnenin tam adı |
bucket | sicim | Bu nesnenin bulunduğu paketin adı. |
generation | int | Bu nesnenin Google Bulut Depolama nesnesi oluşturma . |
metageneration | int | Bu nesnenin Google Bulut Depolama nesnesi meta üretimi . |
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üzenlemesi. |
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, dizi> | Ek, geliştirici tarafından belirlenen özel meta verilerin anahtar/değer çiftleri. |
request.resource
generation
, metageneration
, etag
, timeCreated
ve updated
dışında bunların hepsini içerir.
Güvenlik Kuralları sınırları
Güvenlik kurallarıyla çalışırken aşağıdaki sınırlara dikkat edin:
sınır | Detaylar |
---|---|
İstek başına maksimum firestore.exists() ve firestore.get() çağrı sayısı | Tek belge istekleri ve sorgu istekleri için 2. Bu sınırın aşılması, izin reddedildi hatasıyla sonuçlanır. Aynı belgelere yapılan erişim çağrıları önbelleğe alınabilir ve önbelleğe alınan çağrılar limitlere dahil edilmez. |
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 yer alan 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 izni vermek için kullandığı yöntemlerdir.
read
vewrite
kuralları, geniş okuma ve yazma erişimi sağlarkenvalidate
kuralları, gelen veya mevcut verilere dayalı olarak erişim vermek için ikincil bir doğrulama işlevi görür. - Koşul: Doğru olarak değerlendirilirse bir isteğe izin veren koşul.
Kurallar yollara nasıl uygulanır?
Gerçek Zamanlı Veritabanında, Kurallar atomik olarak uygulanır, yani daha yüksek düzeydeki ana düğümlerdeki kurallar, daha ayrıntılı alt düğümlerdeki kuralları geçersiz kılar ve daha derin bir düğümdeki kurallar bir üst yola erişim izni veremez. Ana yollardan biri için zaten izin verdiyseniz, veritabanı yapınızdaki daha derin bir yolda 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ı, / /foo/
true
değerine sahip bir çocuk baz
içerdiği her durumda / /bar/
öğesinin okunmasına izin verir. /foo/bar/
altındaki ".read": false
kuralının burada bir 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 çabayla uygulanmasına izin verir. Bu, özellikle kullanıcı tabanlı güvenlik için kullanışlıdır.
Ancak, .validate
kuralları kademeli değildir. Yazmaya izin verilmesi için tüm doğrulama kurallarının hiyerarşinin tüm düzeylerinde karşılanması gerekir.
Ek olarak, kurallar bir üst yola geri uygulanmadığından, istenen konumda veya üst konumda erişim sağlayan 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 olacaktır. Bu yapıyı göz önünde bulundurun:
{ "rules": { "records": { "rec1": { ".read": true }, "rec2": { ".read": false } } } }
Kuralların atomik olarak değerlendirildiğini anlamadan, /records/
yolunu getirmek rec1
döndürürken rec2
döndürmez gibi görünebilir. 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
/records/
adresindeki okuma işlemi atomik olduğundan ve /records/
altındaki tüm verilere erişim sağlayan 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/
yoluna erişime izin vermediğinden işlem reddedildi, ancak rec1
kuralının, istediğimiz yolda olmadığı için hiçbir zaman değerlendirilmediğini unutmayın. rec1
getirmek için ona doğrudan erişmemiz 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ı, yol segmentlerini 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 parçanızın ö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 }
}
}
}