Cloud Storage için Firebase Güvenlik Kuralları, Cloud Storage'da depolanan dosyalara kimin okuma ve yazma erişimine sahip olduğunun yanı sıra dosyaların nasıl yapılandırıldığını ve hangi meta verileri içerdiklerini belirlemek için kullanılır. Bulut Depolama Güvenlik Kuralları, dosya yükleme veya dosya meta verilerini alma gibi istenen bir request
izin verme veya reddetme isteğini ve resource
dikkate alan kurallardan oluşur. Bu referans belgeleri; kural türlerini, bir request
ve resource
özelliklerini, Bulut Depolama Güvenlik Kuralları tarafından kullanılan veri türlerini ve hataların nasıl oluştuğunu kapsar.
Kural
rule
bir request
istenen eylemi gerçekleştirmesine izin verilip verilmediğini belirlemek için değerlendirilen bir ifadedir.
Türler
İzin vermek
allow
kuralları, read
veya write
gibi bir yöntemin yanı sıra isteğe bağlı bir koşuldan oluşur. Bir kural yürütüldüğünde koşul değerlendirilir ve koşul true
olarak değerlendirilirse istenen yönteme izin verilir; aksi takdirde yöntem reddedilir. Koşulsuz bir allow
kuralı her zaman istenen yönteme izin verir.
// Always allow method allow <method>; // Allow method if condition is true allow <method>: if <condition>;
Şu anda allow
verilen tek kural türüdür.
Talep Yöntemleri
Okumak
read
yöntemi, dosya indirmeleri ve dosya meta verilerinin okunması dahil, dosya verilerinin veya meta verilerin okunduğu tüm istekleri kapsar.
// Always allow reads allow read; // Allow reads if condition evaluates to true allow read: if <condition>;
Yazmak
write
yöntemi, dosya yüklemeleri, dosya silmeleri ve dosya meta verisi güncellemeleri de dahil olmak üzere, dosya verilerinin veya meta verilerin yazıldığı tüm istekleri kapsar.
// Always allow writes allow write; // Allow writes if condition evaluates to true allow write: if <condition>;
Kibrit
Bir kullanıcı request
(dosya yükleme veya indirme gibi) bir kuralın kapsadığı dosya yoluyla eşleştiğinde kurallar yürütülür. Bir match
, en az bir allow
kuralı içermesi gereken bir yol ve gövdeden oluşur. Hiçbir yol eşleşmezse istek reddedilir.
Tam olarak adlandırılmış bir yolu match
veya belirli bir desene uyan tüm yolları eşleştirmek için joker karakterler ekleyebilirsiniz.
Yol Segmentleri
single_segment
Cloud Storage'da depolanan bir dosyayla eşleşen bir kural oluşturmak için tek yol segmentlerini kullanabilirsiniz.
// Allow read at "path" if condition evaluates to true match /path { allow read: if <condition>; }
Çoklu yol bölümlerine ve iç içe geçmiş yollara da izin verilir:
// Allow read at "path/to/object" if condition evaluates to true match /path { match /to { match /object { allow read: if <condition>; } } }
{single_segment_wildcard}
Bir kuralı aynı yoldaki birden fazla dosyaya uygulamak istiyorsanız, belirli bir yoldaki tüm dosyaları eşleştirmek için joker karakter yol segmenti kullanabilirsiniz. Bir joker karakter değişkeni, bir değişkeni küme parantezleri içine alarak bir yolda bildirilir: {variable}
. Bu değişkene match deyimi içinde bir string
olarak erişilebilir.
// Allow read at any path "/*", if condition evaluates to true match /{single_path} { // Matches "path", "to", or "object" but not "path/to/object" allow read: if <condition>; }
Birden çok yol parçasında ve iç içe geçmiş yollarda da joker karakterler bulunabilir:
// Allow read at any path "/path/*/newPath/*", if condition evaluates to true match /path/{first_wildcard} { match /newPath/{second_wildcard} { // Matches "path/to/newPath/newObject" or "path/from/newPath/oldObject" allow read: if <condition>; } }
{multi_segment_wildcard=**}
Bir yolun içindeki veya altındaki herhangi bir sayıda yol parçasını eşleştirmek istiyorsanız, konumun altındaki ve konumdaki tüm istekleri eşleştirecek çok bölümlü bir joker karakter kullanabilirsiniz. Bu, kullanıcıya kendi serbest biçimli depolama alanını sağlamak veya birçok farklı yol bölümüyle eşleşen kurallar oluşturmak (herkese açık olarak okunabilen bir dosya kümesi oluşturmak veya tüm yazma işlemleri için kimlik doğrulama gerektirmek gibi) açısından yararlı olabilir.
Çok bölümlü joker karakter yolu, tek bölümlü joker karaktere benzer şekilde, değişkenin sonuna =**
işaretinin eklenmesiyle bildirilir: {variable=**}
. Çok bölümlü bir joker karakter değişkeni, match deyiminde bir path
nesnesi olarak mevcuttur.
// Allow read at any path "/**", if condition evaluates to true match /{multi_path=**} { // Matches anything at or below this, from "path", "path/to", "path/to/object", ... allow read: if <condition>; }
Rica etmek
request
değişkeni, o yolda yapılan isteği temsil edecek bir koşul içinde sağlanır. request
değişkeni, gelen isteğe izin verilip verilmeyeceğine karar vermek için kullanılabilecek bir takım özelliklere sahiptir.
Özellikler
auth
Kimliği doğrulanmış bir kullanıcı Cloud Storage'a karşı bir istek gerçekleştirdiğinde, auth
değişkeni kullanıcının kullanıcı uid
( request.auth.uid
) yanı sıra Firebase Kimlik Doğrulama JWT'nin ( request.auth.token
) talepleriyle doldurulur.
request.auth.token
aşağıdaki anahtarlardan bazılarını veya tamamını içerir:
Alan | Tanım |
---|---|
email | Varsa, hesapla ilişkili e-posta adresi. |
email_verified | true Kullanıcı email adresine erişimi olduğunu doğruladıysa. Bazı sağlayıcılar, sahip oldukları e-posta adreslerini otomatik olarak doğrular. |
phone_number | Varsa, hesapla ilişkili telefon numarası. |
name | Ayarlanmışsa kullanıcının görünen adı. |
sub | Kullanıcının Firebase UID'si. Bu, bir proje içinde benzersiz bir durumdur. |
firebase.identities | Bu kullanıcının hesabıyla ilişkili tüm kimliklerin sözlüğü. Sözlüğün anahtarları aşağıdakilerden herhangi biri olabilir: email , phone , google.com , facebook.com , github.com , twitter.com . Sözlüğün değerleri, hesapla ilişkili her kimlik sağlayıcı için benzersiz tanımlayıcılardan oluşan dizilerdir. Örneğin auth.token.firebase.identities["google.com"][0] hesapla ilişkilendirilen ilk Google kullanıcı kimliğini içerir. |
firebase.sign_in_provider | Bu belirteci almak için kullanılan oturum açma sağlayıcısı. Şu dizelerden biri olabilir: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com . |
firebase.tenant | Varsa, hesapla ilişkili kiracı kimliği. örneğin tenant2-m6tyz |
Özel kimlik doğrulama kullanılıyorsa request.auth.token
ayrıca geliştirici tarafından belirtilen özel talepleri de içerir.
Kimliği doğrulanmamış bir kullanıcı bir istek gerçekleştirdiğinde request.auth
null
olur.
// Allow requests from authenticated users allow read, write: if request.auth != null;
path
path
değişkeni, request
gerçekleştirildiği yolu içerir.
// Allow a request if the first path segment equals "images" allow read, write: if request.path[0] == 'images';
resource
resource
değişkeni, yüklenmekte olan bir dosyanın meta verilerini veya mevcut bir dosyanın güncellenmiş meta verilerini içerir. Bu, yeni meta verilerin aksine, istenen yoldaki geçerli dosya meta verilerini içeren resource
değişkeniyle ilgilidir.
// Allow a request if the new value is smaller than 5MB allow read, write: if request.resource.size < 5 * 1024 * 1024;
request.resource
resource
aşağıdaki özellikleri içerir:
Mülk |
---|
name |
bucket |
metadata |
size |
contentType |
time
time
değişkeni, bir isteğin değerlendirildiği geçerli sunucu zamanını temsil eden bir zaman damgasını içerir. Bunu, dosyalara zamana dayalı erişim sağlamak için kullanabilirsiniz; örneğin: dosyaların yalnızca belirli bir tarihe kadar yüklenmesine izin vermek veya dosyaların yalnızca yüklendikten sonraki bir saate kadar okunmasına izin vermek.
// Allow a read if the file was created less than one hour ago allow read: if request.time < resource.timeCreated + duration.value(1, 'h');
Zaman damgaları ve süreleri kullanarak kural yazmak için birçok işlev sağlanmıştır.
Kaynak
resource
değişkeni, Cloud Storage'daki dosyalara ilişkin dosya adı, boyut, oluşturma zamanı ve özel meta veriler gibi dosya meta verilerini içerir.
Özellikler
name
Dosyanın yolu da dahil olmak üzere dosyanın tam adını içeren bir dize.
// Allow reads if the resource name is "path/to/object" allow read: if resource.name == 'path/to/object'
bucket
Bu dosyanın depolandığı Google Cloud Storage paketini içeren bir dize.
// Allow reads of all resources in your bucket allow read: if resource.bucket == '<your-cloud-storage-bucket>'
generation
Dosyanın Google Cloud Storage nesne oluşumunu içeren bir int. Nesne versiyonlaması için kullanılır.
// Allow reads if the resource matches a known object version allow read: if resource.generation == <known-generation>
metageneration
Dosyanın Google Cloud Storage nesne meta oluşturulmasını içeren bir int. Nesne versiyonlaması için kullanılır.
// Allow reads if the resource matches a known object metadata version allow read: if resource.metageneration == <known-generation>
size
Bayt cinsinden dosya boyutunu içeren bir int.
// Allow reads if the resource is less than 10 MB allow read: if resource.size < 10 * 1024 * 1024;
timeCreated
Dosyanın ne zaman oluşturulduğunu temsil eden zaman damgası.
// Allow reads if the resource was created less than an hour ago allow read: if resource.timeCreated < request.time + duration.value(60, "m")
updated
Dosyanın en son ne zaman güncellendiğini gösteren zaman damgası.
// Allow reads if the resource was updated less than an hour ago allow read: if resource.updated < request.time + duration.value(60, "m")
md5Hash
Dosyanın MD5 karmasını içeren bir dize.
// Allow writes if the hash of the uploaded file is the same as the existing file allow write: if request.resource.md5Hash == resource.md5Hash;
crc32c
Dosyanın crc32c karmasını içeren bir dize.
// Allow writes if the hash of the uploaded file is the same as the existing file allow write: if request.resource.crc32c == resource.crc32c;
etag
Dosyanın etag'ını içeren bir dize.
// Allow writes if the etag matches a known object etag allow write: if resource.etag == <known-generation>
contentDisposition
Dosyanın içerik düzenini içeren bir dize.
// Allow reads if the content disposition matches a certain value allow read: if resource.contentDisposition == 'inlined';
contentEncoding
Dosyanın içerik kodlamasını içeren bir dize.
// Allow reads if the content is encoded with gzip allow read: if resource.contentEncoding == 'gzip';
contentLanguage
Dosyanın içerik dilini içeren bir dize.
// Allow reads if the content language is Japanese allow read: if resource.contentLanguage == 'ja';
contentType
Dosyanın içerik türünü içeren bir dize.
// Allow reads if the content type is PNG. allow read: if resource.contentType == 'image/png';
metadata
Geliştiricinin sağladığı ek meta veri alanlarını içeren bir Map<String, String>
.
// Allow reads if a certain metadata field matches a desired value allow read: if resource.metadata.customProperty == 'customValue';
firestore.get ve firestore.exists
firestore.get()
ve firestore.exists()
işlevleri, karmaşık yetkilendirme kriterlerini değerlendirmek için Cloud Firestore'daki belgelere erişmenize olanak tanır.
firestore.get()
ve firestore.exists()
işlevlerinin her ikisi de tam olarak belirlenmiş belge yolları bekler. firestore.get()
ve firestore.exists()
için yollar oluşturmak amacıyla değişkenleri kullanırken, $(variable)
sözdizimini kullanarak değişkenlerden açıkça çıkış yapmanız gerekir.
firestore.get
Cloud Firestore belgesinin içeriğini alın.
service firebase.storage { match /b/{bucket}/o { match /users/{club}/files/{fileId} { allow read: if club in firestore.get(/databases/(default)/documents/users/$(request.auth.uid)).data.memberships } } }
firestore.exists
Cloud Firestore belgesinin mevcut olup olmadığını kontrol edin.
service firebase.storage { match /b/{bucket}/o { match /users/{userId}/photos/{fileId} { allow read: if firestore.exists(/databases/(default)/documents/users/$(userId)/friends/$(request.auth.uid)) } } }
Hizmet
service
, Bulut Depolama Güvenlik Kuralları dosyasındaki ilk bildirimdir ve bu kuralların hangi hizmete uygulanacağını belirtir.
İsim
name
Hizmet kurallarının adı uygulanacaktır. Geçerli tek değer firebase.storage
.
// Specify the service name service firebase.storage { match /b/{bucket}/o { ... } }
Veri tipleri
Kurallar dili, is
operatörünü kullanarak türü kontrol etmenize olanak tanır.
// For example
a is null
a is string
null
null
veri türü mevcut olmayan bir değeri temsil eder.
allow read: if request.auth != null;
bool
bool
türü bir boole true
veya false
değerini temsil eder.
allow read: if true; // always succeeds allow write: if false; // always fails
Karşılaştırmak
Boolean değerleri ==
operatörleri !=
kullanılarak karşılaştırılabilir.
Boole İşlemleri
Operasyon | İfade |
---|---|
AND | x && y |
OR | x || y |
NOT | !x |
İşlemler kısa devre yapar ve true
, false
veya Error değerini döndürebilir.
allow read: if true || false; // always succeeds, short circuits at true allow write: if false && true; // always fails, short circuits at false
int
ve float
int
ve float
türleri sayıları temsil eder. Int'ler: 0
, 1
, -2
vb., kayan noktalar ise: 1.0
, -2.0
, 3.33
vb.
Int'ler imzalı 64 bit değerlerdir ve değişkenler 64 bit IEEE 754 uyumlu değerlerdir. int
türündeki değerler, float
değeriyle karşılaştırmalarda ve aritmetik işlemlerde kullanıldığında, float
zorlanacaktır.
Karşılaştırmak
Int'ler ve kayan değerler ==
, !=
, >
, <
, >=
ve <=
operatörleri kullanılarak karşılaştırılabilir ve sıralanabilir.
Aritmetik
Int'ler ve kayan noktalar eklenebilir, çıkarılabilir, çarpılabilir, bölünebilir, modüle edilebilir ve olumsuzlanabilir:
Operasyon | İfade |
---|---|
Ek | x + y |
Çıkarma | x - y |
Çarpma işlemi | x * y |
Bölüm | x / y |
Modulo | x % y |
Olumsuzluk | -x |
Matematiksel fonksiyonlar
Firebase Security Rules for Cloud Storage ayrıca ifadeleri basitleştirmek için bir dizi matematik yardımcı işlevi de sağlar:
İşlev | Tanım |
---|---|
math.ceil(x) | Sayısal değerin tavanı |
math.floor(x) | Sayısal değerin tabanı |
math.round(x) | Giriş değerini en yakın int'ye yuvarlayın |
math.abs(x) | Girişin mutlak değeri |
math.isInfinite(x) | Değerin ±∞ olup olmadığını test edin, bir bool döndürür |
math.isNaN(x) | Değerin bir sayı olup olmadığını test edin NaN , bir bool döndürür |
string
Karşılaştırmak
Dizeler ==
, !=
, >
, <
, >=
ve <=
operatörleri kullanılarak sözlüksel olarak karşılaştırılabilir ve sıralanabilir.
birleştirme
Dizeler +
operatörü kullanılarak birleştirilebilir.
// Concatenate a file name and extension 'file' + '.txt'
Dizin ve Aralık
index
operatörü string[]
, dizede belirtilen dizindeki karakteri içeren bir dize döndürür.
// Allow reads of files that begin with 'a' match /{fileName} { allow read: if fileName[0] == 'a'; }
range
operatörü string[i:j]
, i
(dahil) j
(hariç) kadar belirtilen indeksler arasındaki karakterleri içeren bir dize döndürür. i
veya j
belirtilmezse, varsayılan olarak sırasıyla 0 ve dizenin boyutu olur, ancak aralığın geçerli olması için en azından i
veya j
belirtilmesi gerekir.
// Allow reads of files that begin with 'abcdef' match /{fileName} { allow read: if fileName[0:6] == 'abcdef'; }
Sağlanan indeksler dize sınırlarını aşarsa index
ve range
operatörleri hata verecektir.
size
Dizedeki karakter sayısını döndürür.
// Allow files with names less than 10 characters match /{fileName} { allow write: if fileName.size() < 10; }
matches
Bir normal ifade eşleşmesi gerçekleştirir, dize verilen normal ifadeyle eşleşirse true
döndürür. Google RE2 sözdizimini kullanır.
// Allow writes to files which end in ".txt" match /{fileName} { allow write: if fileName.matches('.*\\.txt') }
split
Bir dizeyi sağlanan normal ifadeye göre böler ve dizelerin bir list
döndürür. Google RE2 sözdizimini kullanır.
// Allow files named "file.*" to be uploaded match /{fileName} { allow write: if fileName.split('.*\\..*')[0] == 'file' }
path
Yollar, isteğe bağlı kalıp eşleşmesine sahip dizin benzeri adlardır. Eğik çizginin varlığı /
bir yol bölümünün başlangıcını belirtir.
path
Bir string
değişkenini path
dönüştürür.
// Allow reads on a specific file path match /{allFiles=**} { allow read: if allFiles == path('/path/to/file'); }
timestamp
Zaman damgaları UTC cinsindendir ve olası değerler 0001-01-01T00.00.00Z'den başlayıp 9999-12-31T23.59.59Z'de biter.
Karşılaştırmak
Zaman damgaları ==
, !=
, >
, <
, >=
ve <=
operatörleri kullanılarak karşılaştırılabilir ve sıralanabilir.
Aritmetik
Zaman damgaları, zaman damgaları ve süreler arasında toplama ve çıkarmayı aşağıdaki şekilde destekler:
İfade | Sonuç |
---|---|
timestamp + duration | timestamp |
duration + timestamp | timestamp |
timestamp - duration | timestamp |
timestamp - timestamp | duration |
duration + duration | duration |
duration - duration | duration |
date
Yalnızca year
, month
ve day
içeren bir timestamp
değeri.
// Allow reads on the same day that the resource was created. allow read: if request.time.date() == resource.timeCreated.date()
year
1'den 9999'a kadar int olarak yıl değeri.
// Allow reads on all requests made before 2017 allow read: if request.time.year() < 2017
month
Ayın int cinsinden değeri, 1'den 12'ye kadar.
// Allow reads on all requests made during the month of January allow read: if request.time.month() == 1;
day
Ayın geçerli günü, int olarak, 1'den 31'e kadar.
// Allow reads on all requests made during the first day of each month allow read: if request.time.day() == 1;
time
Geçerli saati içeren duration
değeri.
// Allow reads on all requests made before 12PM allow read: if request.time.time() < duration.time(12, 0, 0, 0);
hours
İnt olarak saat değeri, 0'dan 23'e kadar.
// Allow reads on all requests made before 12PM allow read: if request.time.hours() < 12;
minutes
Dakika değeri int olarak 0'dan 59'a kadardır.
// Allow reads during even minutes of every hour allow read: if request.time.minutes() % 2 == 0;
seconds
İnt olarak saniye değeri, 0'dan 59'a kadar.
// Allow reads during the second half of each minute allow read: if request.time.seconds() > 29;
nanos
İnt olarak nano cinsinden kesirli saniye.
// Allow reads during the first 0.1 seconds of each second allow read: if request.time.nanos() < 100000000;
dayOfWeek
Haftanın günü, 1'den (Pazartesi) 7'ye (Pazar).
// Allow reads on weekdays (Monday to Friday) allow read: if request.time.dayOfWeek() < 6;
dayOfYear
İçinde bulunulan yılın günü, 1'den 366'ya kadar.
// Allow reads every fourth day allow read: if request.time.dayOfYear() % 4 == 0;
toMillis
Unix döneminden bu yana geçen mevcut milisaniye sayısını döndürür.
// Allow reads if the request is made before a specified time allow read: if request.time.toMillis() < <milliseconds>;
duration
Süre değerleri saniye artı nanosaniye cinsinden kesirli saniye olarak temsil edilir.
Karşılaştırmak
Süreler ==
, !=
, >
, <
, >=
ve <=
operatörleri kullanılarak karşılaştırılabilir ve sıralanabilir.
Aritmetik
Süreler, zaman damgaları ve süreler arasında toplama ve çıkarmayı aşağıdaki şekilde destekler:
İfade | Sonuç |
---|---|
timestamp + duration | timestamp |
duration + timestamp | timestamp |
timestamp - duration | timestamp |
timestamp - timestamp | duration |
duration + duration | duration |
duration - duration | duration |
seconds
Geçerli süredeki saniye sayısı. -315.576.000.000 ile +315.576.000.000 (dahil) arasında olmalıdır.
nanos
Geçerli sürenin kesirli saniye sayısı (nanosaniye cinsinden). -999,999,999 ile +999,999,999 (dahil) arasında olmalıdır. Sıfır olmayan saniyeler ve sıfır olmayan nanosaniyeler için her ikisinin işaretleri uyumlu olmalıdır.
duration.value
Süreler, verilen büyüklük ve birimden bir zaman süresi oluşturan duration.value(int magnitude, string units)
işlevi kullanılarak oluşturulabilir.
// All of these durations represent one hour: duration.value(1, "h") duration.value(60, "m") duration.value(3600, "s")
Olası unit
şunlardır:
Süre | unit |
---|---|
Haftalar | w |
Günler | d |
Saat | h |
dakika | m |
Saniye | s |
Milisaniye | ms |
Nanosaniye | ns |
duration.time
Süreler, verilen duration.time(int hours, int minutes, int seconds, int nanoseconds)
işlevi kullanılarak oluşturulabilir.
// Create a four hour, three minute, two second, one nanosecond duration duration.time(4, 3, 2, 1)
list
Bir liste, şu türlerde olabilen sıralı bir değerler dizisi içerir: null
, bool
, int
, float
, string
, path
, list
, map
, timestamp
veya duration
.
list
tipinde x
ve y
ve int
tipinde i
ve j
verildiğinde
Yaratılış
Bir liste oluşturmak için parantezlerin arasına değerler ekleyin:
// Create a list of strings ['apples', 'grapes', 'bananas', 'cheese', 'goats']
Karşılaştırmak
Listeler ==
operatörleri !=
kullanılarak karşılaştırılabilir. İki listenin eşitliği tüm değerlerin eşit olmasını gerektirir.
Dizin ve Aralık
index
operatörü list[]
, listede belirtilen dizindeki öğeyi döndürür.
// Allow reads of all files that begin with 'a' match /{fileName} { allow read: if fileName[0] == 'a'; }
range
operatörü list[i:j]
, bir listedeki, i
(dahil)'den j
(hariç) kadar belirtilen indeksler arasındaki tüm öğeleri döndürür. i
veya j
belirtilmezse, varsayılan olarak sırasıyla 0 ve listenin boyutu olur, ancak aralığın geçerli olması için en azından i
veya j
belirtilmesi gerekir.
// Allow reads of all files that begin with 'abcdef' match /{fileName} { allow read: if fileName[0:6] == 'abcdef'; }
in
İstenilen değer listede mevcutsa true
, yoksa false
değerini döndürür.
// Allow read if a filename has the string 'txt' in it match /{fileName} { allow read: if 'txt' in fileName.split('\\.'); }
join
Dizelerin listesini, verilen dizeyle ayrılmış tek bir dizede birleştirir.
// Allow reads if the joined array is 'file.txt' allow read: if ['file', 'txt'].join('.') == 'file.txt';
size
Listedeki öğe sayısı.
// Allow read if there are three items in our list allow read: if ['foo', 'bar', 'baz'].size() == 3;
hasAll
Listede tüm değerler mevcutsa true
döndürür.
// Allow read if one list has all items in the other list allow read: if ['file', 'txt'].hasAll(['file', 'txt']);
map
Bir harita, anahtar/değer çiftleri içerir; burada anahtarlar dizedir ve değerler aşağıdakilerden herhangi biri olabilir: null
, bool
, int
, float
, string
, path
, list
, map
, timestamp
veya duration
.
Yaratılış
Bir harita oluşturmak için kaşlı ayraçların arasına anahtar/değer çiftleri ekleyin:
// Create a map of strings to strings { 'mercury': 'mars', 'rain': 'cloud', 'cats': 'dogs', }
Karşılaştırmak
Haritalar ==
operatörleri !=
kullanılarak karşılaştırılabilir. İki haritanın eşitliği, tüm anahtarların her iki haritada da mevcut olmasını ve tüm değerlerin eşit olmasını gerektirir.
Dizin
Bir haritadaki değerlere parantez veya nokta gösterimi kullanılarak erişilir:
// Access custom metadata properties allow read: if resource.metadata.property == 'property' allow write: if resource.metadata['otherProperty'] == 'otherProperty'
Anahtar mevcut değilse bir error
döndürülür.
in
İstenilen anahtar haritada mevcutsa true
, yoksa false
değerini döndürür.
// Allow reads if a property is present in the custom metadata allow read: if property in resource.metadata;
size
Haritadaki anahtarların sayısı.
// Allow reads if there's exactly one custom metadata key allow read: if resource.metadata.size() == 1;
keys
Haritadaki tüm tuşların listesi.
// Allow reads if the first metadata key is 'myKey' allow read: if resource.metadata.keys()[0] == 'myKey';
values
Haritadaki tüm değerlerin anahtar sırasına göre listesi.
// Allow reads if the first metadata value is 'myValue' allow read: if resource.metadata.values()[0] == 'myValue';
Hatalar
Hata Değerlendirmesi
Bulut Depolama için Firebase Güvenlik Kuralları, hatalarla karşılaşıldığında değerlendirmeye devam eder. Bu kullanışlıdır çünkü koşullu &&
ve ||
Koşul aksi takdirde sırasıyla false
veya true
olarak kısa devre yaparsa ifadeler bir hatayı absorbe edebilir. Örneğin:
İfade | Sonuç |
---|---|
error && true | error |
error && false | false |
error || true | true |
error || false | error |
Hataların ortaya çıktığı yaygın yerler şunlardır: sıfıra bölme, var olmayan bir liste veya haritadaki değerlere erişim ve yanlış türdeki değerlerin bir işleve iletilmesi.
// Error if resource.size is zero allow read: if 1000000 / resource.size; // Error, key doesn't exist allow read: if resource.metadata.nonExistentKey == 'value'; // Error, no unit 'y' exists allow read: if request.time < resource.timeCreated + duration.value(1, 'y');