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