Bulut Depolama Referansı için Firebase Güvenlik Kuralları

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');