Cloud Firestore Security Rules की मदद से, अपने डेटाबेस में मौजूद दस्तावेज़ों और कलेक्शन का ऐक्सेस कंट्रोल किया जा सकता है. नियमों के सिंटैक्स में बदलाव करने की सुविधा की मदद से, ऐसे नियम बनाए जा सकते हैं जो किसी भी चीज़ से मेल खाते हों. जैसे, सभी राइट ऑपरेशन, पूरा डेटाबेस या किसी खास दस्तावेज़ पर की जाने वाली कार्रवाइयां.
इस गाइड में, सुरक्षा नियमों के बुनियादी सिंटैक्स और स्ट्रक्चर के बारे में बताया गया है. पूरे नियम सेट बनाने के लिए, इस सिंटैक्स को सुरक्षा नियमों की शर्तों के साथ मिलाएं.
सेवा और डेटाबेस से जुड़ा एलान
Cloud Firestore Security Rules हमेशा इस एलान से शुरू करें:
service cloud.firestore {
match /databases/{database}/documents {
// ...
}
}
service cloud.firestore
के एलान से, नियम Cloud Firestore पर लागू होते हैं. इससे Cloud Firestore Security Rules और Cloud Storage जैसे अन्य प्रॉडक्ट के नियमों के बीच टकराव नहीं होता.
match /databases/{database}/documents
एलान से पता चलता है कि नियम, प्रोजेक्ट में मौजूद किसी भी Cloud Firestore डेटाबेस से मेल खाने चाहिए. फ़िलहाल, हर प्रोजेक्ट में सिर्फ़ एक डेटाबेस है, जिसका नाम (default)
है.
पढ़ने/लिखने के बुनियादी नियम
बुनियादी नियमों में, match
स्टेटमेंट होता है. इसमें दस्तावेज़ का पाथ बताया जाता है. साथ ही, allow
एक्सप्रेशन होता है. इसमें बताया जाता है कि तय किए गए डेटा को कब पढ़ा जा सकता है:
service cloud.firestore {
match /databases/{database}/documents {
// Match any document in the 'cities' collection
match /cities/{city} {
allow read: if <condition>;
allow write: if <condition>;
}
}
}
सभी मैच स्टेटमेंट, कलेक्शन के बजाय दस्तावेज़ों की ओर ले जाने चाहिए. मैच स्टेटमेंट, किसी खास दस्तावेज़ की ओर इशारा कर सकता है. जैसे, match /cities/SF
या वाइल्डकार्ड का इस्तेमाल करके, तय किए गए पाथ में मौजूद किसी भी दस्तावेज़ की ओर इशारा कर सकता है. जैसे, match /cities/{city}
.
ऊपर दिए गए उदाहरण में, मैच स्टेटमेंट में {city}
वाइल्डकार्ड सिंटैक्स का इस्तेमाल किया गया है.
इसका मतलब है कि यह नियम, cities
कलेक्शन में मौजूद किसी भी दस्तावेज़ पर लागू होता है. जैसे, /cities/SF
या /cities/NYC
. जब मैच स्टेटमेंट में मौजूद allow
एक्सप्रेशन का आकलन किया जाता है, तब city
वैरिएबल, शहर के दस्तावेज़ के नाम में बदल जाएगा. जैसे, SF
या NYC
.
ज़्यादा जानकारी वाली कार्रवाइयां
कुछ मामलों में, read
और write
को ज़्यादा बारीक ऑपरेशनों में बांटना फ़ायदेमंद होता है. उदाहरण के लिए, हो सकता है कि आपका ऐप्लिकेशन, दस्तावेज़ बनाने के लिए अलग-अलग शर्तें लागू करना चाहे. हालांकि, दस्तावेज़ मिटाने के लिए अलग शर्तें लागू करना चाहे. इसके अलावा, आपके पास यह विकल्प भी है कि एक बार में सिर्फ़ एक दस्तावेज़ को पढ़ने की अनुमति दी जाए, लेकिन बड़ी क्वेरी को अस्वीकार कर दिया जाए.
read
नियम को get
और list
में बांटा जा सकता है. वहीं, write
नियम को create
, update
, और delete
में बांटा जा सकता है:
service cloud.firestore {
match /databases/{database}/documents {
// A read rule can be divided into get and list rules
match /cities/{city} {
// Applies to single document read requests
allow get: if <condition>;
// Applies to queries and collection read requests
allow list: if <condition>;
}
// A write rule can be divided into create, update, and delete rules
match /cities/{city} {
// Applies to writes to nonexistent documents
allow create: if <condition>;
// Applies to writes to existing documents
allow update: if <condition>;
// Applies to delete operations
allow delete: if <condition>;
}
}
}
हैरारकी वाला डेटा
Cloud Firestore में डेटा को दस्तावेज़ों के कलेक्शन में व्यवस्थित किया जाता है. साथ ही, हर दस्तावेज़ में सब-कलेक्शन के ज़रिए, हैरारकी को बढ़ाया जा सकता है. यह समझना ज़रूरी है कि सुरक्षा के नियम, क्रमबद्ध डेटा के साथ कैसे इंटरैक्ट करते हैं.
मान लें कि cities
कलेक्शन में मौजूद हर दस्तावेज़ में landmarks
सब-कलेक्शन मौजूद है. सुरक्षा के नियम सिर्फ़ मैच किए गए पाथ पर लागू होते हैं. इसलिए, cities
कलेक्शन पर तय किए गए ऐक्सेस कंट्रोल, landmarks
सब-कलेक्शन पर लागू नहीं होते. इसके बजाय, सब-कलेक्शन के ऐक्सेस को कंट्रोल करने के लिए साफ़ तौर पर नियम लिखें:
service cloud.firestore {
match /databases/{database}/documents {
match /cities/{city} {
allow read, write: if <condition>;
// Explicitly define rules for the 'landmarks' subcollection
match /landmarks/{landmark} {
allow read, write: if <condition>;
}
}
}
}
match
स्टेटमेंट को नेस्ट करते समय, अंदरूनी match
स्टेटमेंट का पाथ हमेशा बाहरी match
स्टेटमेंट के पाथ के हिसाब से होता है. इसलिए, ये दोनों नियम एक जैसे हैं:
service cloud.firestore {
match /databases/{database}/documents {
match /cities/{city} {
match /landmarks/{landmark} {
allow read, write: if <condition>;
}
}
}
}
service cloud.firestore {
match /databases/{database}/documents {
match /cities/{city}/landmarks/{landmark} {
allow read, write: if <condition>;
}
}
}
बार-बार होने वाले वाइल्डकार्ड
अगर आपको नियमों को किसी भी लेवल की नेस्टिंग वाली डायरेक्ट्री पर लागू करना है, तो रिकर्सिव वाइल्डकार्ड सिंटैक्स {name=**}
का इस्तेमाल करें. उदाहरण के लिए:
service cloud.firestore {
match /databases/{database}/documents {
// Matches any document in the cities collection as well as any document
// in a subcollection.
match /cities/{document=**} {
allow read, write: if <condition>;
}
}
}
रिकर्सिव वाइल्डकार्ड सिंटैक्स का इस्तेमाल करने पर, वाइल्डकार्ड वैरिएबल में मैच करने वाला पूरा पाथ सेगमेंट शामिल होगा. भले ही, दस्तावेज़ किसी सब-कलेक्शन में मौजूद हो. उदाहरण के लिए, ऊपर दिए गए नियम, /cities/SF/landmarks/coit_tower
पर मौजूद किसी दस्तावेज़ से मेल खाएंगे. साथ ही, document
वैरिएबल की वैल्यू SF/landmarks/coit_tower
होगी.
हालांकि, ध्यान दें कि रिकर्सिव वाइल्डकार्ड का व्यवहार, नियमों के वर्शन पर निर्भर करता है.
वर्शन 1
सुरक्षा के नियम, डिफ़ॉल्ट रूप से वर्शन 1 का इस्तेमाल करते हैं. वर्शन 1 में, रिकर्सिव वाइल्डकार्ड, एक या उससे ज़्यादा पाथ आइटम से मेल खाते हैं. ये खाली पाथ से मेल नहीं खाते. इसलिए, match /cities/{city}/{document=**}
सब-कलेक्शन में मौजूद दस्तावेज़ों से मेल खाता है, लेकिन cities
कलेक्शन में मौजूद दस्तावेज़ों से मेल नहीं खाता. वहीं, match /cities/{document=**}
, cities
कलेक्शन और सब-कलेक्शन, दोनों में मौजूद दस्तावेज़ों से मेल खाता है.
रिकर्सिव वाइल्डकार्ड, मैच स्टेटमेंट के आखिर में होने चाहिए.
वर्शन 2
सुरक्षा नियमों के वर्शन 2 में, रिकर्सिव वाइल्डकार्ड, शून्य या उससे ज़्यादा पाथ आइटम से मेल खाते हैं. match/cities/{city}/{document=**}
, किसी भी सब-कलेक्शन के साथ-साथ cities
कलेक्शन में मौजूद दस्तावेज़ों से भी मेल खाता है.
आपको वर्शन 2 के लिए ऑप्ट-इन करना होगा. इसके लिए, सुरक्षा नियमों के सबसे ऊपर rules_version = '2';
जोड़ें:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Matches any document in the cities collection as well as any document
// in a subcollection.
match /cities/{city}/{document=**} {
allow read, write: if <condition>;
}
}
}
मैच स्टेटमेंट में ज़्यादा से ज़्यादा एक रिकर्सिव वाइल्डकार्ड हो सकता है. हालांकि, वर्शन 2 में इस वाइल्डकार्ड को मैच स्टेटमेंट में कहीं भी रखा जा सकता है. उदाहरण के लिए:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Matches any document in the songs collection group
match /{path=**}/songs/{song} {
allow read, write: if <condition>;
}
}
}
अगर कलेक्शन ग्रुप क्वेरी का इस्तेमाल किया जाता है, तो आपको वर्शन 2 का इस्तेमाल करना होगा. कलेक्शन ग्रुप क्वेरी को सुरक्षित करने के बारे में जानें.
मिलान की शर्तों का ओवरलैप होना
ऐसा हो सकता है कि कोई दस्तावेज़ एक से ज़्यादा match
स्टेटमेंट से मेल खाए. अगर किसी अनुरोध से एक से ज़्यादा allow
एक्सप्रेशन मैच करते हैं, तो ऐक्सेस की अनुमति तब दी जाती है, जब कोई भी शर्त true
हो:
service cloud.firestore {
match /databases/{database}/documents {
// Matches any document in the 'cities' collection.
match /cities/{city} {
allow read, write: if false;
}
// Matches any document in the 'cities' collection or subcollections.
match /cities/{document=**} {
allow read, write: if true;
}
}
}
ऊपर दिए गए उदाहरण में, cities
कलेक्शन में सभी रीड और राइट की अनुमति होगी, क्योंकि दूसरा नियम हमेशा true
होता है. भले ही, पहला नियम हमेशा false
होता है.
सुरक्षा के नियमों से जुड़ी सीमाएं
सुरक्षा नियमों का इस्तेमाल करते समय, इन सीमाओं का ध्यान रखें:
सीमा | विवरण |
---|---|
हर अनुरोध के लिए, exists() , get() , और getAfter() को ज़्यादा से ज़्यादा exists() बार कॉल किया जा सकता है |
इनमें से किसी भी सीमा को पार करने पर, अनुमति नहीं दी जाएगी. दस्तावेज़ के ऐक्सेस से जुड़े कुछ कॉल को कैश मेमोरी में सेव किया जा सकता है. कैश मेमोरी में सेव किए गए कॉल, सीमा में शामिल नहीं किए जाते. |
नेस्ट किए गए match स्टेटमेंट की ज़्यादा से ज़्यादा गहराई |
10 |
नेस्ट किए गए match स्टेटमेंट के सेट में, पाथ सेगमेंट में पाथ की ज़्यादा से ज़्यादा लंबाई |
100 |
नेस्ट किए गए match स्टेटमेंट के सेट में, पाथ कैप्चर करने वाले वैरिएबल की ज़्यादा से ज़्यादा संख्या |
20 |
फ़ंक्शन कॉल की ज़्यादा से ज़्यादा डेप्थ | 20 |
फ़ंक्शन के आर्ग्युमेंट की ज़्यादा से ज़्यादा संख्या | 7 |
हर फ़ंक्शन के लिए, let वैरिएबल बाइंडिंग की ज़्यादा से ज़्यादा संख्या |
10 |
रिकर्सिव या साइक्लिक फ़ंक्शन कॉल की ज़्यादा से ज़्यादा संख्या | 0 (अनुमति नहीं है) |
हर अनुरोध के लिए, आकलन किए गए एक्सप्रेशन की ज़्यादा से ज़्यादा संख्या | 1,000 |
नियमों के सेट का ज़्यादा से ज़्यादा साइज़ | नियमों के सेट के लिए, साइज़ से जुड़ी दो सीमाएं तय की गई हैं. इनका पालन करना ज़रूरी है:
|
अगले चरण
- कस्टम सुरक्षा नियमों की शर्तें लिखें.
- सुरक्षा नियमों का रेफ़रंस पढ़ें.