Cloud Storage रेफ़रंस के लिए Firebase के सुरक्षा नियम

Cloud Storage के लिए Firebase Security Rules का इस्तेमाल यह पता लगाने के लिए किया जाता है कि किसके पास पढ़ने और लिखने का ऐक्सेस है Cloud Storage में सेव की गई फ़ाइलों पर लागू किए गए असर और उनमें कौनसा मेटाडेटा शामिल है. Cloud Storage Security Rules ऐसे नियमों से मिलकर बना है जो कोई कार्रवाई करने की अनुमति देने या न देने के लिए, request और resource को जैसे कि फ़ाइल अपलोड करने या फ़ाइल मेटाडेटा को वापस पाने के लिए. इन रेफ़रंस दस्तावेज़ों में नियम के टाइप, request और resource की प्रॉपर्टी, और डेटा Cloud Storage Security Rules में किस टाइप का इस्तेमाल किया गया और गड़बड़ियां कैसे होती हैं.

नियम

rule एक एक्सप्रेशन है, जिसका आकलन करके यह तय किया जाता है कि request को मनचाही कार्रवाई करने की अनुमति दी गई है.

टाइप

अनुमति दें

allow नियमों में एक पद्धति होती है, जैसे read या write, और साथ ही एक वैकल्पिक शर्त. जब कोई नियम लागू होता है, तो शर्त का आकलन किया जाता है और अगर शर्त की वैल्यू true की वैल्यू आती है, तो अपने हिसाब से तरीका चुना जा सकता है; नहीं तो, को अस्वीकार कर दिया गया हो. बिना किसी शर्त वाला allow नियम हमेशा पसंदीदा तरीका चुनें.

// Always allow method
allow <method>;

// Allow method if condition is true
allow <method>: if <condition>;

फ़िलहाल, सिर्फ़ allow का इस्तेमाल किया जा सकता है.

अनुरोध के तरीके

पढ़ें

read तरीके में वे सभी अनुरोध शामिल होते हैं जिनमें फ़ाइल डेटा या मेटाडेटा पढ़ा जाता है, इसमें फ़ाइल डाउनलोड और फ़ाइल मेटाडेटा के पढ़ने की सुविधा शामिल है.

// Always allow reads
allow read;

// Allow reads if condition evaluates to true
allow read: if <condition>;

लिखें

write वाले तरीके में, ऐसे सभी अनुरोध शामिल होते हैं जिनमें फ़ाइल डेटा या मेटाडेटा लिखा जाता है, इनमें फ़ाइल अपलोड, फ़ाइल मिटाने, और फ़ाइल मेटाडेटा के अपडेट शामिल हैं.

// Always allow writes
allow write;

// Allow writes if condition evaluates to true
allow write: if <condition>;

मिलान

नियम तब लागू किए जाते हैं, जब उपयोगकर्ता request (जैसे कि फ़ाइल अपलोड या डाउनलोड) करता है का मिलान नियम से कवर होने वाले फ़ाइल पाथ से होता है. match में एक पाथ और एक मुख्य भाग होता है, जिसमें कम से कम एक allow नियम होना चाहिए. अगर कोई पाथ मेल नहीं खाता है, तो अनुरोध अस्वीकार कर दिया गया है.

नाम वाले पाथ को match किया जा सकता है या सभी से मेल खाने के लिए वाइल्डकार्ड शामिल किए जा सकते हैं ऐसे पाथ जो खास पैटर्न में फ़िट होते हैं.

पथ सेगमेंट

single_segment

सिंगल पाथ सेगमेंट का इस्तेमाल करके, ऐसा नियम बनाया जा सकता है जो सेव की गई फ़ाइल से मेल खाता हो Cloud Storage में.

// Allow read at "path" if condition evaluates to true
match /path {
  allow read: if <condition>;
}

एक से ज़्यादा पाथ सेगमेंट और नेस्ट किए गए पाथ की भी अनुमति है:

// Allow read at "path/to/object" if condition evaluates to true
match /path {
  match /to {
    match /object {
      allow read: if <condition>;
    }
  }
}

{single_segment_wildcard}

अगर आप एक ही पाथ की कई फ़ाइलों पर एक नियम लागू करना चाहते हैं, तो आप वाइल्डकार्ड पाथ सेगमेंट का इस्तेमाल करें. वाइल्डकार्ड वैरिएबल किसी वैरिएबल को कर्ली ब्रैकेट में रैप करके, पाथ में तय किया जाता है: {variable}. इस वैरिएबल को मैच स्टेटमेंट में string के तौर पर ऐक्सेस किया जा सकता है.

// 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>;
}

एक से ज़्यादा पाथ सेगमेंट और नेस्ट किए गए पाथ में वाइल्डकार्ड भी हो सकते हैं:

// 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=**}

अगर आपको पाथ पर या उसके नीचे, कितने भी पाथ सेगमेंट मैच करने हैं, तो एक से ज़्यादा सेगमेंट वाला वाइल्डकार्ड, जो स्थान. इससे उपयोगकर्ता को उन्हें मुफ़्त में फ़ॉर्म देने में मदद मिल सकती है या ऐसे नियम बनाना जो कई अलग-अलग पाथ सेगमेंट से मेल खाते हों (जैसे जैसे कि फ़ाइलों का सार्वजनिक रूप से पढ़ने लायक सेट बनाना या सभी लिखते हैं).

एक से ज़्यादा सेगमेंट वाइल्डकार्ड पाथ का एलान, एक सेगमेंट की तरह ही किया गया है वाइल्डकार्ड से जुड़ा डेटा, जिसमें वैरिएबल के आखिर में =** जोड़ा गया है: {variable=**}. मैच में एक से ज़्यादा सेगमेंट वाला वाइल्डकार्ड वैरिएबल उपलब्ध है path ऑब्जेक्ट के रूप में स्टेटमेंट.

// 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>;
}

अनुरोध

request वैरिएबल को एक शर्त में दिया जाता है, ताकि अनुरोध किया जा रहा है. request वैरिएबल में कई प्रॉपर्टी. इन प्रॉपर्टी का इस्तेमाल करके यह तय किया जा सकता है कि आने वाले अनुरोध की अनुमति दी जाए या नहीं.

प्रॉपर्टी

auth

जब कोई पुष्टि किया गया उपयोगकर्ता, Cloud Storage के लिए अनुरोध करता है, auth वैरिएबल में, उपयोगकर्ता की uid (request.auth.uid) जानकारी इस तरह से अपने-आप भर जाती है और Firebase Authentication JWT (request.auth.token) के दावे.

request.auth.token में इनमें से कुछ या सभी कुंजियां मौजूद हैं:

फ़ील्ड ब्यौरा
email अगर खाते से जुड़ा ईमेल पता मौजूद है, तो उसे डालें.
email_verified true अगर उपयोगकर्ता ने पुष्टि कर दी है कि उसके पास email पते का ऐक्सेस है. कुछ कंपनियां अपने मालिकाना हक वाले ईमेल पतों की पुष्टि अपने-आप करती हैं.
phone_number खाते से जुड़ा फ़ोन नंबर, अगर मौजूद हो.
name अगर सेट हो, तो उपयोगकर्ता का डिसप्ले नेम.
sub उपयोगकर्ता का Firebase यूआईडी. यह किसी प्रोजेक्ट के लिए यूनीक होता है.
firebase.identities इस उपयोगकर्ता के खाते से जुड़ी सभी पहचानों की डिक्शनरी. शब्दकोश की कुंजियां इनमें से कोई भी हो सकती हैं: email, phone, google.com, facebook.com, github.com, twitter.com. डिक्शनरी की वैल्यू, खाते से जुड़े हर आइडेंटिटी प्रोवाइडर के यूनीक आइडेंटिफ़ायर की कैटगरी होती हैं. उदाहरण के लिए, auth.token.firebase.identities["google.com"][0] में खाते से जुड़ा पहला Google यूज़र आईडी शामिल होता है.
firebase.sign_in_provider इस टोकन को पाने के लिए, साइन इन करने की सेवा देने वाली कंपनी का इस्तेमाल किया गया. यह इनमें से कोई एक स्ट्रिंग हो सकती है: custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com.
firebase.tenant अगर खाते से जुड़ा किराये पर इस्तेमाल करने वाला व्यक्ति मौजूद है, तो उसका आईडी. उदाहरण के लिए, tenant2-m6tyz अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

अगर कस्टम ऑथेंटिकेशन का इस्तेमाल किया जा रहा है, तो request.auth.token में कस्टम ऑथेंटिकेशन भी होता है डेवलपर के तय किए गए दावों के हिसाब से.

जब कोई ऐसा उपयोगकर्ता अनुरोध करता है जिसकी पुष्टि नहीं हुई है, तो request.auth की वैल्यू null होती है.

// Allow requests from authenticated users
allow read, write: if request.auth != null;

path

path वैरिएबल में वह पाथ शामिल है जिस पर request का इस्तेमाल किया जा रहा है टीम में हुए हैं.

// Allow a request if the first path segment equals "images"
allow read, write: if request.path[0] == 'images';

resource

resource वैरिएबल में अपलोड की जा रही फ़ाइल का मेटाडेटा या किसी मौजूदा फ़ाइल के लिए अपडेट किया गया मेटाडेटा. यह resource वैरिएबल, जिसमें मौजूदा फ़ाइल मेटाडेटा यह शामिल है: का अनुरोध किया गया है, वह नए मेटाडेटा से अलग है.

// Allow a request if the new value is smaller than 5MB
allow read, write: if request.resource.size < 5 * 1024 * 1024;

request.resource में resource की ये प्रॉपर्टी शामिल हैं:

प्रॉपर्टी
name
bucket
metadata
size
contentType

time

time वैरिएबल में एक टाइमस्टैंप है, जो सर्वर के मौजूदा समय को दिखाता है में अनुरोध की जाँच की जा रही है. समय के हिसाब से ऐक्सेस देने के लिए, इसका इस्तेमाल किया जा सकता है का इस्तेमाल किया जा सकता है. जैसे: सिर्फ़ किसी तय तारीख तक फ़ाइलों को अपलोड करने की अनुमति देना, या फ़ाइलों को अपलोड किए जाने के एक घंटे तक ही पढ़ने की अनुमति दें.

// Allow a read if the file was created less than one hour ago
allow read: if request.time < resource.timeCreated + duration.value(1, 'h');

नियम लिखने के लिए, टाइमस्टैंप और अवधि.

संसाधन

resource वैरिएबल में Cloud Storage, जैसे कि फ़ाइल का नाम, साइज़, फ़ाइल बनाने का समय, और कस्टम मेटाडेटा.

प्रॉपर्टी

name

इस स्ट्रिंग में फ़ाइल का पूरा नाम और उसका पाथ शामिल होता है.

// Allow reads if the resource name is "path/to/object"
allow read: if resource.name == 'path/to/object'

bucket

Google Cloud Storage वाली स्ट्रिंग बकेट जिसमें इस फ़ाइल को सेव किया जाता है.

// Allow reads of all resources in your bucket
allow read: if resource.bucket == '<your-cloud-storage-bucket>'

generation

Google Cloud Storage वाला खाता में से ऑब्जेक्ट जनरेट करना फ़ाइल से लिंक किया गया है. इसका इस्तेमाल ऑब्जेक्ट वर्शनिंग के लिए किया जाता है.

// Allow reads if the resource matches a known object version
allow read: if resource.generation == <known-generation>

metageneration

Google Cloud Storage वाला खाता ऑब्जेक्ट मेटाजनरेशन फ़ाइल से. इसका इस्तेमाल ऑब्जेक्ट वर्शनिंग के लिए किया जाता है.

// Allow reads if the resource matches a known object metadata version
allow read: if resource.metageneration == <known-generation>

size

वह पूर्णांक जिसमें फ़ाइल का साइज़ बाइट में होता है.

// Allow reads if the resource is less than 10 MB
allow read: if resource.size < 10 * 1024 * 1024;

timeCreated

फ़ाइल के बनाए जाने का समय दिखाने वाला टाइमस्टैंप.

// Allow reads if the resource was created less than an hour ago
allow read: if resource.timeCreated < request.time + duration.value(60, "m")

updated

फ़ाइल के आखिरी बार अपडेट होने की तारीख बताने वाला टाइमस्टैंप.

// Allow reads if the resource was updated less than an hour ago
allow read: if resource.updated < request.time + duration.value(60, "m")

md5Hash

इस स्ट्रिंग में हेडर का MD5 हैश शामिल होता है फ़ाइल से लिए जाते हैं.

// 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

इस स्ट्रिंग में crc32c हैश, फ़ाइल से लिए जाते हैं.

// 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

एक स्ट्रिंग जिसमें फ़ाइल से लिए जाते हैं.

// Allow writes if the etag matches a known object etag
allow write: if resource.etag == <known-generation>

contentDisposition

इस स्ट्रिंग में फ़ाइल का कॉन्टेंट मैनेजमेंट होता है.

// Allow reads if the content disposition matches a certain value
allow read: if resource.contentDisposition == 'inlined';

contentEncoding

इस स्ट्रिंग में फ़ाइल की कॉन्टेंट एन्कोडिंग होती है.

// Allow reads if the content is encoded with gzip
allow read: if resource.contentEncoding == 'gzip';

contentLanguage

इस स्ट्रिंग में फ़ाइल के कॉन्टेंट की भाषा होती है.

// Allow reads if the content language is Japanese
allow read: if resource.contentLanguage == 'ja';

contentType

इस स्ट्रिंग में फ़ाइल का कॉन्टेंट टाइप शामिल होता है.

// Allow reads if the content type is PNG.
allow read: if resource.contentType == 'image/png';

metadata

एक Map<String, String>, जिसमें डेवलपर से मिला अतिरिक्त मेटाडेटा शामिल है फ़ील्ड.

// Allow reads if a certain metadata field matches a desired value
allow read: if resource.metadata.customProperty == 'customValue';

Firestore.get और Firestore.exists

firestore.get() और firestore.exists() फ़ंक्शन की मदद से दस्तावेज़ में मौजूद कुछ दस्तावेज़, Cloud Firestore में मौजूद दस्तावेज़ हैं.

firestore.get() और firestore.exists() फ़ंक्शन, दोनों दस्तावेज़ के पूरी तरह से तय पाथ. वैरिएबल का इस्तेमाल करके पाथ बनाते समय firestore.get() और firestore.exists() हैं, तो आपको इन्हें साफ़ तौर पर छोड़ना होगा $(variable) सिंटैक्स का इस्तेमाल करने वाले वैरिएबल.

Firestore.get

Cloud Firestore दस्तावेज़ का कॉन्टेंट पाएं.

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.मौजूद है

देखें कि Cloud Firestore दस्तावेज़ मौजूद है या नहीं.

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))
    }
  }
}

सेवा

Cloud Storage Security Rules फ़ाइल में, service पहला एलान है और तय करती है कि ये नियम किस सेवा पर लागू होंगे.

नाम

name

जिन पर सेवा के नियम लागू होंगे. फ़िलहाल, सिर्फ़ यह वैल्यू मौजूद है firebase.storage.

// Specify the service name
service firebase.storage {
  match /b/{bucket}/o {
    ...
  }
}

डेटा प्रकार

Rules भाषा की मदद से, is ऑपरेटर का इस्तेमाल करके टाइप की जांच की जा सकती है.

// For example
a is null
a is string

null

null डेटा टाइप में ऐसी वैल्यू दिखाई गई है जो मौजूदा नहीं है.

allow read: if request.auth != null;

bool

bool टाइप, बूलियन true या false वैल्यू को दिखाता है.

allow read: if true;   // always succeeds
allow write: if false; // always fails

तुलना

बूलियन वैल्यू की तुलना, == ऑपरेटर != का इस्तेमाल करके की जा सकती है.

बूलियन ऑपरेशंस

कार्रवाई एक्सप्रेशन
AND x && y
OR x || y
NOT !x

ऑपरेशन शॉर्ट सर्किट होता है और यह true, false या गड़बड़ी.

allow read: if true || false;   // always succeeds, short circuits at true
allow write: if false && true; // always fails, short circuits at false

int और float

int और float टाइप में संख्याएं होती हैं. इंटरसेप्शन हैं: 0, 1, -2 वगैरह. , जबकि फ़्लोट ये हैं: 1.0, -2.0, 3.33 वगैरह.

इंटरसेप्शन 64-बिट वैल्यू, और फ़्लोट, 64-बिट आईईईई 754 के मुताबिक होने वाली वैल्यू होते हैं. तुलनाओं और उनमें इस्तेमाल होने पर, int टाइप की वैल्यू को float तय किया जाएगा float वैल्यू वाली अंकगणितीय संक्रियाएं.

तुलना

इन्ट और फ़्लोट की तुलना और उन्हें क्रम में लगाने के लिए, ==, !=, >, <, >=, और <= ऑपरेटर.

अंकगणित

इन्ट और फ़्लोट को जोड़ा जा सकता है, घटाया जा सकता है, गुणा किया जा सकता है, विभाजित किया जा सकता है, मॉड्यूल किया जा सकता है, और रद्द किया गया:

कार्रवाई एक्सप्रेशन
जोड़ x + y
घटाव x - y
गुणा x * y
डिवीज़न x / y
मॉड्यूलो x % y
नेगेटिव -x

गणितीय फ़ंक्‍शन

Cloud Storage के लिए Firebase Security Rules, गणित के कई सवालों के हेल्पर भी उपलब्ध कराता है फ़ंक्शन को आसान बनाने के लिए ये काम करें:

फ़ंक्शन ब्यौरा
math.ceil(x) न्यूमेरिक वैल्यू की सीलिंग
math.floor(x) न्यूमेरिक वैल्यू का फ़्लोर
math.round(x) इनपुट वैल्यू को सबसे करीब के पूर्णांक में बदल दें
math.abs(x) इनपुट की ऐब्सलूट वैल्यू
math.isInfinite(x) जांच करें कि मान ±∞ है या नहीं, यह bool दिखाता है
math.isNaN(x) जांच करें कि क्या मान कोई संख्या NaN नहीं है, bool देता है

string

तुलना

==, !=, >, <, >=, और <= ऑपरेटर.

स्ट्रिंग जोड़ने की प्रोसेस

+ ऑपरेटर का इस्तेमाल करके स्ट्रिंग जोड़ी जा सकती हैं.

// Concatenate a file name and extension
'file' + '.txt'

इंडेक्स और रेंज

index ऑपरेटर, string[], ऐसी स्ट्रिंग देता है जिसमें वर्ण होता है .

// Allow reads of files that begin with 'a'
match /{fileName} {
  allow read: if fileName[0] == 'a';
}

range ऑपरेटर, string[i:j], ऐसी स्ट्रिंग दिखाता है जिसमें बताई गई इंडेक्स के बीच i (शामिल) से j तक (अतिरिक्त विकल्प). अगर i या j तय नहीं किया गया है, तो डिफ़ॉल्ट रूप से 0 और साइज़ स्ट्रिंग, क्रम के हिसाब से है, लेकिन कम से कम i या j तय करना ज़रूरी है तय करें.

// Allow reads of files that begin with 'abcdef'
match /{fileName} {
  allow read: if fileName[0:6] == 'abcdef';
}

अगर इंडेक्स दिया गया है, तो index और range ऑपरेटर गड़बड़ी दिखाएगा स्ट्रिंग की सीमाओं से ज़्यादा हो.

size

यह फ़ंक्शन स्ट्रिंग में वर्णों की संख्या दिखाता है.

// Allow files with names less than 10 characters
match /{fileName} {
  allow write: if fileName.size() < 10;
}

matches

रेगुलर एक्सप्रेशन मिलान करता है, अगर स्ट्रिंगtrue रेगुलर एक्सप्रेशन दिया गया है. इस्तेमाल Google RE2 सिंटैक्स.

// Allow writes to files which end in ".txt"
match /{fileName} {
  allow write: if fileName.matches('.*\\.txt')
}

split

दिए गए रेगुलर एक्सप्रेशन के हिसाब से स्ट्रिंग को बांटता है और list दिखाता है . Google RE2 सिंटैक्स का इस्तेमाल किया जाता है.

// Allow files named "file.*" to be uploaded
match /{fileName} {
  allow write: if fileName.split('.*\\..*')[0] == 'file'
}

path

पाथ, डायरेक्ट्री जैसे नाम होते हैं. इनमें वैकल्पिक पैटर्न मैचिंग की सुविधा होती है. कॉन्टेंट बनाने फ़ॉरवर्ड स्लैश / का इस्तेमाल करने से, पाथ सेगमेंट की शुरुआत का पता चलता है.

path

string तर्क को path में बदलता है.

// Allow reads on a specific file path
match /{allFiles=**} {
  allow read: if allFiles == path('/path/to/file');
}

timestamp

टाइमस्टैंप यूटीसी में होते हैं और उनकी संभावित वैल्यू 0001-01-01T00.00.00Z से शुरू होती हैं और 9999-12-31T23.59.59Z पर खत्म होता है.

तुलना

==, !=, >, <, >=, और इन यूआरएल का इस्तेमाल करके टाइमस्टैंप की तुलना की जा सकती है और इन्हें क्रम से लगाया जा सकता है <= ऑपरेटर.

अंकगणित

टाइमस्टैंप के ज़रिए, टाइमस्टैंप और अवधि के बीच इस तरह से जोड़ा और घटाव किया जा सकता है अनुसरण करता है:

एक्सप्रेशन नतीजा
timestamp + duration timestamp
duration + timestamp timestamp
timestamp - duration timestamp
timestamp - timestamp duration
duration + duration duration
duration - duration duration

date

timestamp की ऐसी वैल्यू जिसमें सिर्फ़ year, month, और day शामिल हैं.

// Allow reads on the same day that the resource was created.
allow read: if request.time.date() == resource.timeCreated.date()

year

पूर्णांक के रूप में साल की वैल्यू, 1 से 9999 तक.

// Allow reads on all requests made before 2017
allow read: if request.time.year() < 2017

month

पूर्णांक के रूप में महीने की वैल्यू, 1 से 12 तक.

// Allow reads on all requests made during the month of January
allow read: if request.time.month() == 1;

day

पूर्णांक के रूप में महीने का मौजूदा दिन, 1 से 31 तक.

// Allow reads on all requests made during the first day of each month
allow read: if request.time.day() == 1;

time

मौजूदा समय वाली duration वैल्यू.

// Allow reads on all requests made before 12PM
allow read: if request.time.time() < duration.time(12, 0, 0, 0);

hours

घंटे का मान, पूर्णांक के रूप में, 0 से 23 तक.

// Allow reads on all requests made before 12PM
allow read: if request.time.hours() < 12;

minutes

पूर्णांक के रूप में मिनट की वैल्यू, 0 से 59 तक.

// Allow reads during even minutes of every hour
allow read: if request.time.minutes() % 2 == 0;

seconds

सेकंड की वैल्यू, पूर्णांक के रूप में, 0 से 59 तक.

// Allow reads during the second half of each minute
allow read: if request.time.seconds() > 29;

nanos

नैनो सेकंड में पूर्णांक के तौर पर फ़्रैक्शनल सेकंड.

// Allow reads during the first 0.1 seconds of each second
allow read: if request.time.nanos() < 100000000;

dayOfWeek

हफ़्ते का दिन, 1 (सोमवार) से 7 (रविवार) तक.

// Allow reads on weekdays (Monday to Friday)
allow read: if request.time.dayOfWeek() < 6;

dayOfYear

मौजूदा साल का दिन, 1 से 366 तक.

// Allow reads every fourth day
allow read: if request.time.dayOfYear() % 4 == 0;

toMillis

Unix epoch के बाद के मिलीसेकंड की मौजूदा संख्या दिखाता है.

// Allow reads if the request is made before a specified time
allow read: if request.time.toMillis() < <milliseconds>;

duration

अवधि की वैल्यू को सेकंड और फ़्रैक्शनल सेकंड के तौर पर दिखाया जाता है नैनोसेकंड.

तुलना

==, !=, >, <, >=, और <= ऑपरेटर.

अंकगणित

कुल समय के लिए, टाइमस्टैंप और अवधि के बीच इस तरह से जोड़ा और घटाव किया जा सकता है: अनुसरण करता है:

एक्सप्रेशन नतीजा
timestamp + duration timestamp
duration + timestamp timestamp
timestamp - duration timestamp
timestamp - timestamp duration
duration + duration duration
duration - duration duration

seconds

मौजूदा अवधि में सेकंड की संख्या. यह -3,15,57,00,00,000 के बीच होना चाहिए और +3,15,576,000,000 भी शामिल हैं.

nanos

मौजूदा अवधि के फ़्रैक्शनल सेकंड (नैनोसेकंड में) की संख्या. ज़रूर -9,99,999,999 और +9,99,999,999 के बीच का होना चाहिए. नॉन-ज़ीरो सेकंड के लिए और नॉन-ज़ीरो नैननसेकंड, दोनों के संकेत एक-दूसरे से सहमत होने चाहिए.

duration.value

duration.value(int magnitude, string units) का इस्तेमाल करके, समयावधि तय की जा सकती है फ़ंक्शन, जो दिए गए माप और इकाई से समयावधि बनाता है.

// All of these durations represent one hour:
duration.value(1, "h")
duration.value(60, "m")
duration.value(3600, "s")

संभावित unit ये हैं:

अवधि unit
हफ़्ते w
दिन d
घंटे h
मिनट m
सेकंड s
मिलीसेकंड ms
नैनोसेकंड ns

duration.time

समय की जानकारी पाने के लिए, duration.time(int hours, int minutes, int seconds, int nanoseconds) फ़ंक्शन, जो दिए गए घंटे, मिनट, सेकंड, और नैनोसेकंड.

// Create a four hour, three minute, two second, one nanosecond duration
duration.time(4, 3, 2, 1)

list

सूची में, वैल्यू का क्रम तय किया गया अरे होता है. ये वैल्यू इस तरह की हो सकती हैं: null, bool, int, float, string, path, list, map, timestamp या duration.

int टाइप के x और y टाइप के साथ-साथ, i और j टाइप के लिएlist

क्रिएशन

सूची बनाने के लिए, ब्रैकेट के बीच में वैल्यू जोड़ें:

// Create a list of strings
['apples', 'grapes', 'bananas', 'cheese', 'goats']

तुलना

== ऑपरेटर != का इस्तेमाल करके, सूचियों की तुलना की जा सकती है. दो सूचियों की समानता सभी वैल्यू बराबर होनी चाहिए.

इंडेक्स और रेंज

index ऑपरेटर, list[], आइटम को सूची.

// Allow reads of all files that begin with 'a'
match /{fileName} {
  allow read: if fileName[0] == 'a';
}

range ऑपरेटर, list[i:j], दोनों के बीच की सूची में सभी आइटम लौटाता है खास इंडेक्स, i (शामिल) से j (खास) तक. अगर i या j नहीं बताया गया है, तो वह डिफ़ॉल्ट रूप से 0 पर और सूची का साइज़ डिफ़ॉल्ट तौर पर सेट होता है, लेकिन श्रेणी को मान्य बनाने के लिए कम से कम i या j दर्ज किए जाने चाहिए.

// Allow reads of all files that begin with 'abcdef'
match /{fileName} {
  allow read: if fileName[0:6] == 'abcdef';
}

in

मनचाहे मान के मौजूद होने पर true लौटाता है या अगर नहीं है, तो false लौटाता है उपस्थित.

// Allow read if a filename has the string 'txt' in it
match /{fileName} {
  allow read: if 'txt' in fileName.split('\\.');
}

join

दी गई स्ट्रिंग से अलग की गई, स्ट्रिंग की सूची को एक स्ट्रिंग में जोड़ता है.

// Allow reads if the joined array is 'file.txt'
allow read: if ['file', 'txt'].join('.') == 'file.txt';

size

सूची में मौजूद आइटम की संख्या.

// Allow read if there are three items in our list
allow read: if ['foo', 'bar', 'baz'].size() == 3;

hasAll

अगर सूची में सभी वैल्यू मौजूद हैं, तो true दिखाता है.

// Allow read if one list has all items in the other list
allow read: if ['file', 'txt'].hasAll(['file', 'txt']);

map

मैप में कुंजी/वैल्यू पेयर होते हैं, जिनमें कुंजियां स्ट्रिंग होती हैं और वैल्यू कोई भी हो सकती है इनमें से: null, bool, int, float, string, path, list, map, timestamp या duration.

क्रिएशन

मैप बनाने के लिए, ब्रैकेट के बीच की/वैल्यू पेयर जोड़ें:

// Create a map of strings to strings
{
  'mercury': 'mars',
  'rain': 'cloud',
  'cats': 'dogs',
}

तुलना

== ऑपरेटर != का इस्तेमाल करके, मैप की तुलना की जा सकती है. दो मैप की समानता यह ज़रूरी है कि सभी कुंजियां, दोनों मैप में मौजूद हों और सभी वैल्यू एक जैसी हों.

इंडेक्स

ब्रैकेट या डॉट नोटेशन का इस्तेमाल करके, मैप में दी गई वैल्यू ऐक्सेस की जा सकती हैं:

// Access custom metadata properties
allow read: if resource.metadata.property == 'property'
allow write: if resource.metadata['otherProperty'] == 'otherProperty'

अगर कोई कुंजी मौजूद नहीं है, तो error दी जाएगी.

in

मैप में मनचाहे कुंजी मौजूद होने पर true लौटाता है या अगर नहीं है, तो false लौटाता है उपस्थित.

// Allow reads if a property is present in the custom metadata
allow read: if property in resource.metadata;

size

मैप में कुंजियों की संख्या.

// Allow reads if there's exactly one custom metadata key
allow read: if resource.metadata.size() == 1;

keys

मैप में मौजूद सभी कुंजियों की सूची.

// Allow reads if the first metadata key is 'myKey'
allow read: if resource.metadata.keys()[0] == 'myKey';

values

मैप में मौजूद सभी वैल्यू की सूची, मुख्य क्रम में.

// Allow reads if the first metadata value is 'myValue'
allow read: if resource.metadata.values()[0] == 'myValue';

गड़बड़ियां

गड़बड़ी का आकलन

गड़बड़ियां मिलने पर, Cloud Storage के लिए Firebase Security Rules आकलन जारी रखें. यह काम का है, क्योंकि कंडिशनल && और || एक्सप्रेशन से गड़बड़ी को समझा जा सकता है अगर शर्त के मुताबिक, किसी और वजह से false या true को शॉर्ट सर्किट किया जाएगा क्रम से. उदाहरण के लिए:

एक्सप्रेशन नतीजा
error && true error
error && false false
error || true true
error || false error

जिन सामान्य जगहों पर गड़बड़ियां होती हैं: शून्य से भाग देना, वैल्यू ऐक्सेस करना किसी ऐसी सूची या मैप में जो मौजूद नहीं है, और गलत टाइप की वैल्यू पास कर रहा है फ़ंक्शन में बदलना है.

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