Güvenlik, uygulama geliştirme yapbozunun en karmaşık parçalarından biri olabilir. Çoğu uygulamada, geliştiricilerin kimlik doğrulama (kullanıcının kim olduğu) ve yetkilendirmeyi (kullanıcının ne yapabileceğini) işler.
Firebase Security Rules, orta (sunucu) katmanı kaldırır ve yola dayalı katmanları belirtmenize olanak tanır verilerinize doğrudan bağlanan istemciler için gerekli izinleri sağlar. Bu kılavuzu kullanarak Kuralların gelen isteklere nasıl uygulandığı hakkında daha fazla bilgi edinin.
Kuralları hakkında daha fazla bilgi edinmek için bir ürün seçin.
Cloud Firestore
Temel yapı
Cloud Firestore ve Cloud Storage içindeki Firebase Security Rules, aşağıdaki yapıyı ve söz dizimini 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
ifadesi içinde çağrılan yöntem veya yöntemler. Bunlar: bu yöntemleri kullanabilirsiniz. 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şimini etkinleştirin. - Yol: URI yolu.
- Kural: Bir şeye izin veren bir koşulu içeren
allow
isteği gönderin.
Güvenlik kuralları sürüm 2
Mayıs 2019 itibarıyla Firebase güvenlik kurallarının 2. sürümü kullanıma sunuldu. Kuralların 2. sürümü, yinelemeli
joker karakterler {name=**}
. Planlıyorsanız sürüm 2'yi kullanmalısınız.
koleksiyon grubu sorgularını kullanın. Şunu etkinleştirmeniz gerekir:
rules_version = '2';
uygulamasını güvenliğinizdeki ilk satır haline getirerek sürüm 2'yi indirin
kurallarınız:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
Eşleşen yollar
Tüm eşleşme ifadeleri koleksiyonları değil, dokümanları işaret etmelidir. Maç
ifadesi, match /cities/SF
ürününde olduğu gibi belirli bir dokümana işaret edebilir veya joker karakterler kullanabilir
belirtilen yoldaki herhangi bir dokümana işaret etmesini sağlar (ör. match /cities/{city}
).
Yukarıdaki örnekte, eşleşme ifadesinde {city}
joker karakter söz dizimi kullanılır.
Bu, kuralın cities
koleksiyonundaki tüm dokümanlar için geçerli olduğu anlamına gelir:
/cities/SF
veya /cities/NYC
. Eşleşme ifadesindeki allow
ifadeleri
city
değişkeni şehir dokümanının adına,
SF
veya NYC
gibi.
Eşleşen alt koleksiyonlar
Cloud Firestore ürünündeki veriler doküman koleksiyonları halinde düzenlenir ve her bir hiyerarşiyi alt koleksiyonlar yoluyla genişletebilir. Bu nedenle, ve güvenlik kurallarının hiyerarşik verilerle nasıl etkileşime girdiğini anlamanızı sağlar.
cities
koleksiyonundaki her dokümanın bir
landmarks
alt koleksiyon. Güvenlik kuralları yalnızca eşleşen yolda geçerli olduğundan cities
koleksiyonunda tanımlanan erişim denetimleri landmarks
alt koleksiyonunda geçerli değildir. Bunun yerine, erişimi kontrol etmek için açık kurallar yazın
alt koleksiyonlara:
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
ifadelerini iç içe yerleştirirken iç match
ifadesinin yolu her zaman
dış match
ifadesinin yolu ile göreceli olarak. Aşağıdaki kural kümeleri
dolayısıyla 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>;
}
}
}
Yinelemeli joker karakterler
Kuralların rastgele derin bir hiyerarşiye uygulanmasını istiyorsanız
yinelemeli joker karakter söz dizimi, {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>;
}
}
}
Yinelemeli joker karakter söz dizimini kullanırken joker karakter değişkeni,
Doküman derin bir şekilde iç içe yerleştirilmiş bir koleksiyonda bulunsa bile, eşleşen yol segmentinin tamamı
alt koleksiyon oluşturun. Örneğin, yukarıda listelenen kurallar,
/cities/SF/landmarks/coit_tower
adresinde bulunan bir doküman ve
document
değişkeni SF/landmarks/coit_tower
olur.
Bununla birlikte, yinelemeli joker karakterlerin davranışının kurallara bağlı olduğunu unutmayın sürümünü değil.
Sürüm 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şiyor. Boş bir yolla eşleşmezler, bu nedenle
match /cities/{city}/{document=**}
, alt koleksiyonlardaki dokümanlarla eşleşir, ancak
cities
koleksiyonunda yok, ancak match /cities/{document=**}
eşleşiyor
hem cities
koleksiyonundaki hem de alt koleksiyonlardaki dokümanlara eşittir.
Yinelemeli joker karakterler, eşleşme ifadesinin sonuna gelmelidir.
Sürüm 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=**}
, tüm alt koleksiyonlardaki dokümanların yanı sıra cities
koleksiyonundaki dokümanlarla eşleşir.
URL'nin üstüne rules_version = '2';
ekleyerek sürüm 2'ye dahil olmanız gerekir
güvenlik kurallarınız:
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 ifadesi başına en fazla bir yinelenen joker karakteriniz olabilir ancak 2 sürümünde 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>;
}
}
}
Koleksiyon grubu sorguları kullanıyorsanız 2. sürümü kullanmanız gerekir. Koleksiyon grubu sorgularının güvenliğini sağlama başlıklı makaleyi inceleyin.
Çakışan eşleşme ifadeleri
Bir belgenin birden fazla match
ifadesiyle eşleşmesi mümkündür.
birden fazla allow
ifadesinin bir istekle eşleştiği durumda, erişime izin verilir
koşullardan herhangi biri true
ise:
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, birinci kural her zaman false
olsa bile ikinci kural her zaman true
olduğu için cities
koleksiyonuna yapılan tüm okuma ve yazma işlemlerine izin verilir.
Güvenlik kuralı sınırları
Güvenlik kurallarıyla çalışırken aşağıdaki sınırlara dikkat edin:
Sınır | Ayrıntılar |
---|---|
İstek başına maksimum exists() , get() ve getAfter() çağrısı sayısı |
Her iki sınırın da aşılması, "izin verilmedi" hatasıyla sonuçlanır. Bazı belge erişimi çağrıları önbelleğe alınabilir. Önbelleğe alınan çağrılar sınırlamaya dahil edilmez. |
Maksimum iç içe yerleştirilen match ifadesi derinliği |
10 |
Yol segmentlerinde, iç içe yerleştirilmiş bir grup match ifadesinde izin verilen maksimum yol uzunluğu |
100 |
İç içe yerleştirilen bir grup match ifadesinde 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 işlev bağlama sayısı |
10 |
Maksimum yinelenen 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 |
Maksimum kural grubu boyutu | Kural kümeleri iki boyut sınırına uymalıdır:
|
Cloud Storage
Temel yapı
Cloud Firestore ve Cloud Storage içindeki Firebase Security Rules, aşağıdaki yapıyı ve söz dizimini 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
ifadesi içinde çağrılan yöntem veya yöntemler. Bunlar: bu yöntemleri kullanabilirsiniz. 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şimini etkinleştirin. - Yol: URI yolu.
- Kural: Bir şeye izin veren bir koşulu içeren
allow
isteği gönderin.
Eşleşen yollar
Cloud Storage Security Rules match
Cloud Storage içindeki dosyalara erişmek için kullanılan dosya yolları. Kurallar, yolların veya joker karakterli yolların match
sını alabilir ve
kuralları da iç içe yerleştirilebilir. Hiçbir eşleşme kuralı bir istek yöntemine izin vermiyorsa veya koşul false
olarak değerlendiriliyorsa 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 kullanarak bir kalıp match
için de kullanılabilir. Joker karakter,
tek bir dizeyi temsil eden adlandırılmış değişken
profilePhoto.png
veya birden fazla yol segmenti, örneğin
images/profilePhoto.png
.
Joker karakter adının etrafına süslü ayraçlar eklenerek (ör.
{string}
Birden fazla segment joker karakteri bildirilebilir. Bunun için=**
joker karakterli ad (örneğin, {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>; } }
Bir dosyayla birden fazla kural eşleşirse tüm gösterimlerin OR
sonucunun
yardımcı olacak pek çok
yararlı uygulama vardır. Yani, dosyanın eşleştiği bir kural true
olarak değerlendirilirse sonuç true
olur.
Yukarıdaki kurallarda, "images/profilePhoto.png" dosyası aşağıdaki koşullardan herhangi biri geçerliyse
condition
veya other_condition
doğru olarak değerlendirilirken dosya
"images/users/user:12345/profileFotoğraf.png" yalnızca şunun sonucuna tabidir:
other_condition
.
Bir joker karakter değişkenine match
sağlama dosyası içinden referans verilebilir
ad veya yol yetkilendirmesi:
// Another way to restrict the name of a file match /images/{imageId} { allow read: if imageId == "profilePhoto.png"; }
Cloud Storage Security Rules basamaklamaz ve kurallar yalnızca istek yolu, belirtilen kurallara sahip bir yolla eşleşiyor.
Değerlendirme iste
Yüklemeler, indirmeler, meta veri değişiklikleri ve silme işlemleri
Cloud Storage alıcısına request
gönderildi. request
değişkeni
isteğin gerçekleştirildiği dosya yolu, isteğin gerçekleştirildiği zaman
değeri ve istek yazma işlemiyse yeni resource
değeri kullanılır. HTTP üstbilgileri
ve kimlik doğrulama durumu da dahil edilir.
request
nesnesi ayrıca kullanıcının benzersiz kimliğini ve
request.auth
nesnesinde Firebase Authentication yükü olacak.
Kimlik Doğrulama bölümünde daha ayrıntılı olarak açıklanmıştır
bölümünde bulabilirsiniz.
request
nesnesindeki özelliklerin tam listesini aşağıda bulabilirsiniz:
Özellik | Tür | Açıklama |
---|---|---|
auth |
eşleme<dize, dize> | Kullanıcı giriş yaptığında uid , kullanıcının benzersiz kimliğini ve
token , Firebase Authentication JWT hak talebinin haritası. Aksi takdirde
null |
params |
eşleme<dize, dize> | İsteğin sorgu parametrelerini içeren eşleme. |
path |
yol | İsteğin yapıldığı yolu temsil eden bir path
gerçekleştiriliyor. |
resource |
eşleme<dize, dize> | Yeni kaynak değeri (yalnızca write isteklerinde bulunur).
|
time |
zaman damgası | İsteğin değerlendirildiği sunucu zamanını temsil eden zaman damgası. |
Kaynak değerlendirme
Kuralları değerlendirirken dosyanın meta verilerini de değerlendirmek isteyebilirsiniz. yükleme, indirme, değiştirme veya silme işlemlerini yapabilir. Bu sayede, 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 verme gibi işlemleri yapan karmaşık ve güçlü kurallar oluşturabilirsiniz.
Cloud Storage için Firebase Security Rules, resource
nesnesinde dosya meta verilerini sağlar. Bu nesne, Cloud Storage nesnesinde gösterilen meta verilerin anahtar/değer çiftlerini içerir. Bu özellikler, veri bütünlüğünü sağlamak için read
veya write
isteklerinde denetlenebilmektedir.
write
isteklerinde (yüklemeler, meta veri güncellemeleri ve silmeler gibi),
dosyanın dosya meta verilerini içeren resource
nesnesine ek
varsa, istek yolunda bulunan URL'leri de
request.resource
nesnesi içerir ve bu, oluşturulacak dosya meta verilerinin bir alt kümesini içerir
yazılması gerekir. Bu iki değeri, uygulamanızın
veya dosya türü ya da boyutu gibi uygulama kısıtlamaları
uygulayabilirsiniz.
resource
nesnesindeki özelliklerin tam listesini aşağıda bulabilirsiniz:
Özellik | Tür | Açıklama |
---|---|---|
name |
dize | Nesnenin tam adı |
bucket |
dize | Bu nesnenin bulunduğu paketin adı. |
generation |
int | Google Cloud Storage nesne oluşturma. |
metageneration |
int | Google Cloud Storage nesne meta oluşturma işlemi gerçekleştirmeniz gerekir. |
size |
int | Nesnenin bayt cinsinden boyutu. |
timeCreated |
zaman damgası | Nesnenin oluşturulduğu zamanı temsil eden bir zaman damgası. |
updated |
zaman damgası | Nesnenin en son ne zaman güncellendiğini gösteren bir zaman damgası. |
md5Hash |
dize | Nesnenin MD5 karması. |
crc32c |
dize | Nesnenin crc32c karması. |
etag |
dize | Bu nesneyle ilişkilendirilen etag. |
contentDisposition |
dize | Bu nesneyle ilişkili içerik gönderme. |
contentEncoding |
dize | Bu nesneyle ilişkilendirilen içerik kodlaması. |
contentLanguage |
dize | Bu nesneyle ilişkilendirilen içerik dili. |
contentType |
dize | Bu nesneyle ilişkili içerik türü. |
metadata |
eşleme<dize, dize> | Geliştirici tarafından belirtilen ek meta verilerin anahtar/değer çiftleri. |
request.resource
, generation
hariç bunların tümünü içerir,
metageneration
, etag
, timeCreated
ve updated
.
Güvenlik kuralı sınırları
Güvenlik kurallarıyla çalışırken aşağıdaki sınırlara dikkat edin:
Sınır | Ayrıntılar |
---|---|
Maksimum firestore.exists() ve
İstek başına firestore.get() arama |
Tek belgeli istekler ve sorgu istekleri için 2. Bu sınırın aşılması, "izin verilmedi" hatasıyla sonuçlanır. Aynı dokümanlara yapılan erişim çağrıları önbelleğe alınabilir ve önbelleğe alınmış aramalar sınırlara dahil edilmez. |
Tam Örnek
Tüm bunları bir araya getirerek bir resim 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 } } } }
Realtime Database
Temel yapı
Realtime Database içinde Firebase Security Rules, JSON belgesinde bulunan JavaScript benzeri ifadelerden oluşur.
Şu söz dizimini kullanırlar:
{
"rules": {
"<<path>>": {
// Allow the request if the condition for each method is true.
".read": <<condition>>,
".write": <<condition>>,
".validate": <<condition>>
}
}
}
Bu kuralda üç temel öğe bulunur:
- 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ş kapsamlı okuma ve yazma erişimi sağlarkenvalidate
kuralları, gelen veya mevcut verilere göre erişim izni vermek için ikincil bir doğrulama görevi görür. - Durum: Bir isteğin doğru olarak değerlendirilmesine izin veren koşul.
Kurallar yollara nasıl uygulanır?
Realtime Database'te Rules atomik olarak uygulanır. Yani daha üst düzey üst öğe düğümlerindeki kurallar, daha ayrıntılı alt öğe düğümlerindeki kuralları geçersiz kılar ve daha derin bir düğümdeki kurallar bir üst öğe yoluna erişim izni veremez. Üst yollardan birine erişim izni verdiyseniz veritabanı yapınızdaki daha derin bir yolda erişim iznini ayrıntılandı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/
ürününün her zaman okunmasına izin verir.
/foo/
, true
değerine sahip bir alt baz
içeriyor.
/foo/bar/
altındaki ".read": false
kuralında
burada geçerlidir. Çünkü erişim, alt yollar tarafından iptal edilemez.
İlk bakışta sezgilerimi kaybetmiş gibi dursa da bu, çok karmaşık erişim ayrıcalıklarının uygulanmasına olanak tanır. minimum çabayla geliştirebilirsiniz. Bu özellik, özellikle kullanıcı tabanlı güvenlik için yararlıdır.
Ancak .validate
kuralları basamaklamaz. Tüm kuralları doğrula
bir yazmaya izin verilmesi için hiyerarşinin tüm düzeylerinde karşılanması gerekir.
Ayrıca, kurallar üst yol için geçerli olmadığından, okuma veya yazma İstenen konumda veya üst öğede bir kural yoksa işlem başarısız olur konum verebilirsiniz. Etkilenen her alt yol erişilebilir olsa bile okuma işlemi tamamen başarısız olur. Şu yapıyı göz önünde bulundurun:
{ "rules": { "records": { "rec1": { ".read": true }, "rec2": { ".read": false } } } }
Kuralların atomik olarak değerlendirildiğini anlamadan,
Örneğin, /records/
yolunu getirmek rec1
sonucunu döndürür.
ancak rec2
değil. 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 }];
Swift
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 }); });
REST
curl https://docs-examples.firebaseio.com/rest/records/ # response returns a PERMISSION_DENIED error
/records/
konumundaki okuma işlemi atomik olduğundan ve /records/
altındaki tüm verilere erişim izni veren bir okuma kuralı olmadığından bu işlem PERMISSION_DENIED
hatası verir. Bu kuralı, Firebase konsolumuzdaki güvenlik simülasyon aracında 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ği için işlem reddedildi. Ancak rec1
kuralının, istediğimiz yolda olmadığı için hiç değerlendirilmediğini unutmayın. rec1
öğesini getirmek için ona doğrudan erişmemiz gerekiyordu:
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! }];
Swift
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 } });
REST
curl https://docs-examples.firebaseio.com/rest/records/rec1 # SUCCESS!
Konum değişkeni
Realtime Database Rules, $location
desteği sunuyor
değişkenini yol segmentleriyle eşleştirin. Yolunuzun önünde $
ön ekini kullanın
öğesini yol boyunca herhangi bir alt düğümle eşleştirin.
{
"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
parametresini sabit yolla paralel olarak da kullanabilirsiniz
gösterir.
{
"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 }
}
}
}