क्लाउड स्टोरेज संदर्भ के लिए फायरबेस सुरक्षा नियम

क्लाउड स्टोरेज के लिए फायरबेस सुरक्षा नियमों का उपयोग यह निर्धारित करने के लिए किया जाता है कि क्लाउड स्टोरेज में संग्रहीत फ़ाइलों को पढ़ने और लिखने की पहुंच किसके पास है, साथ ही फाइलें कैसे संरचित हैं और उनमें कौन सा मेटाडेटा है। क्लाउड स्टोरेज सुरक्षा नियम उन नियमों से बने होते हैं जो किसी वांछित कार्रवाई को अनुमति देने या अस्वीकार करने के लिए request और resource पर विचार करते हैं, जैसे फ़ाइल अपलोड करना या फ़ाइल मेटाडेटा पुनर्प्राप्त करना। ये संदर्भ दस्तावेज़ नियमों के प्रकार, request और resource के गुण, क्लाउड स्टोरेज सुरक्षा नियमों द्वारा उपयोग किए जाने वाले डेटा प्रकार और त्रुटियां कैसे होती हैं, को कवर करते हैं।

नियम

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

आप क्लाउड स्टोरेज में संग्रहीत फ़ाइल से मेल खाने वाला नियम बनाने के लिए एकल पथ खंडों का उपयोग कर सकते हैं।

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

जब एक प्रमाणित उपयोगकर्ता क्लाउड स्टोरेज के खिलाफ अनुरोध करता है, तो auth उपयोगकर्ता के uid ( request.auth.uid ) के साथ-साथ फायरबेस प्रमाणीकरण JWT ( request.auth.token ) के दावों से भर जाता है।

request.auth.token में निम्नलिखित में से कुछ या सभी कुंजियाँ शामिल हैं:

मैदान विवरण
email खाते से संबद्ध ईमेल पता, यदि मौजूद है।
email_verified true यदि उपयोगकर्ता ने सत्यापित कर लिया है कि उनके पास email पते तक पहुंच है। कुछ प्रदाता अपने स्वामित्व वाले ईमेल पते को स्वचालित रूप से सत्यापित करते हैं।
phone_number खाते से संबद्ध फ़ोन नंबर, यदि मौजूद है।
name उपयोगकर्ता का प्रदर्शन नाम, यदि सेट हो।
sub उपयोगकर्ता का फायरबेस यूआईडी. यह किसी प्रोजेक्ट के भीतर अद्वितीय है.
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 चर में क्लाउड स्टोरेज में फ़ाइलों के लिए फ़ाइल मेटाडेटा शामिल है, जैसे फ़ाइल नाम, आकार, निर्माण समय और कस्टम मेटाडेटा।

गुण

name

एक स्ट्रिंग जिसमें फ़ाइल का पथ सहित फ़ाइल का पूरा नाम होता है।

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

bucket

Google क्लाउड स्टोरेज बकेट वाली एक स्ट्रिंग में यह फ़ाइल संग्रहीत है।

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

generation

एक इंट जिसमें फ़ाइल की Google क्लाउड स्टोरेज ऑब्जेक्ट पीढ़ी शामिल है। ऑब्जेक्ट वर्जनिंग के लिए उपयोग किया जाता है।

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

metageneration

एक इंट जिसमें फ़ाइल का Google क्लाउड स्टोरेज ऑब्जेक्ट मेटाजेनरेशन शामिल है। ऑब्जेक्ट वर्जनिंग के लिए उपयोग किया जाता है।

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

size

एक int जिसमें बाइट्स में फ़ाइल का आकार होता है।

// 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() फ़ंक्शन आपको जटिल प्राधिकरण मानदंडों का मूल्यांकन करने के लिए क्लाउड फायरस्टोर में दस्तावेज़ों तक पहुंचने की अनुमति देते हैं।

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

firestore.get

क्लाउड फायरस्टोर दस्तावेज़ की सामग्री प्राप्त करें।

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

जांचें कि क्या क्लाउड फायरस्टोर दस्तावेज़ मौजूद है।

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

सेवा

service क्लाउड स्टोरेज सुरक्षा नियम फ़ाइल में पहली घोषणा है, और निर्दिष्ट करती है कि ये नियम किस सेवा पर लागू होंगे।

नाम

name

सेवा नियमों का नाम जिस पर लागू होगा. एकमात्र वर्तमान मान firebase.storage है।

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

डेटा के प्रकार

नियम भाषा आपको 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 अनुरूप मान हैं। float मान के साथ तुलना और अंकगणितीय संचालन में उपयोग किए जाने पर int प्रकार के मानों को float के लिए बाध्य किया जाएगा।

तुलना

इनट्स और फ्लोट्स की तुलना == , != , > , < , >= , और <= ऑपरेटरों का उपयोग करके की जा सकती है और ऑर्डर किया जा सकता है।

अंकगणित

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

संचालन अभिव्यक्ति
जोड़ना x + y
घटाव x - y
गुणा x * y
विभाजन x / y
सापेक्ष x % y
नकार -x

गणितीय कार्य

क्लाउड स्टोरेज के लिए फायरबेस सुरक्षा नियम अभिव्यक्ति को सरल बनाने के लिए कई गणित सहायक कार्य भी प्रदान करते हैं:

समारोह विवरण
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

टाइमस्टैम्प UTC में हैं, संभावित मान 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

यूनिक्स युग के बाद से मिलीसेकंड की वर्तमान संख्या लौटाता है।

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

वर्तमान अवधि में सेकंड की संख्या. -315,576,000,000 और +315,576,000,000 सहित के बीच होना चाहिए।

nanos

वर्तमान अवधि के आंशिक सेकंड की संख्या (नैनोसेकंड में)। -999,999,999 और +999,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

प्रकार की list x और y तथा int प्रकार की i और j दी गई है

निर्माण

सूची बनाने के लिए, कोष्ठक के बीच मान जोड़ें:

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

त्रुटियाँ

त्रुटि मूल्यांकन

त्रुटियाँ सामने आने पर क्लाउड स्टोरेज के लिए फायरबेस सुरक्षा नियमों का मूल्यांकन जारी रहता है। यह उपयोगी है क्योंकि सशर्त && और || अभिव्यक्तियाँ एक त्रुटि को अवशोषित कर सकती हैं यदि सशर्त अन्यथा क्रमशः 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');