Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

सुरक्षा नियम कैसे काम करते हैं

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

सुरक्षा ऐप डेवलपमेंट पहेली के सबसे जटिल टुकड़ों में से एक हो सकती है। अधिकांश अनुप्रयोगों में, डेवलपर्स को एक सर्वर बनाना और चलाना चाहिए जो प्रमाणीकरण (एक उपयोगकर्ता कौन है) और प्राधिकरण (एक उपयोगकर्ता क्या कर सकता है) को संभालता है।

फायरबेस सुरक्षा नियम मध्य (सर्वर) परत को हटाते हैं और आपको उन क्लाइंट के लिए पथ-आधारित अनुमतियां निर्दिष्ट करने की अनुमति देते हैं जो सीधे आपके डेटा से जुड़ते हैं। आने वाले अनुरोधों पर नियम कैसे लागू होते हैं, इस बारे में अधिक जानने के लिए इस मार्गदर्शिका का उपयोग करें।

किसी उत्पाद के नियमों के बारे में अधिक जानने के लिए उसका चयन करें।

क्लाउड फायरस्टोर

बुनियादी संरचना

क्लाउड फायरस्टोर और क्लाउड स्टोरेज में फायरबेस सुरक्षा नियम निम्नलिखित संरचना और सिंटैक्स का उपयोग करते हैं:

service <<name>> {
  // Match the resource path.
  match <<path>> {
    // Allow the request if the following conditions are true.
    allow <<methods>> : if <<condition>>
  }
}

जब आप नियम बनाते हैं तो निम्नलिखित प्रमुख अवधारणाओं को समझना महत्वपूर्ण है:

  • अनुरोध: allow कथन में लागू की गई विधि या विधियाँ। ये वे तरीके हैं जिन्हें आप चलाने की अनुमति दे रहे हैं। मानक तरीके हैं: get करें, list बनाएं, create , update और deleteread और write की सुविधा के तरीके निर्दिष्ट डेटाबेस या भंडारण पथ पर व्यापक पढ़ने और लिखने की अनुमति देते हैं।
  • पथ: डेटाबेस या भंडारण स्थान, जिसे यूआरआई पथ के रूप में दर्शाया गया है।
  • नियम: allow कथन, जिसमें एक शर्त शामिल है जो अनुरोध की अनुमति देती है यदि यह सत्य का मूल्यांकन करती है।

सुरक्षा नियम संस्करण 2

मई 2019 तक, फायरबेस सुरक्षा नियमों का संस्करण 2 अब उपलब्ध है। नियमों का संस्करण 2 पुनरावर्ती वाइल्डकार्ड {name=**} के व्यवहार को बदल देता है। यदि आप संग्रह समूह प्रश्नों का उपयोग करने की योजना बना रहे हैं तो आपको संस्करण 2 का उपयोग करना चाहिए। आपको rules_version = '2'; आपके सुरक्षा नियमों में पहली पंक्ति:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

मिलान पथ

सभी मिलान विवरण दस्तावेज़ों को इंगित करना चाहिए, संग्रह नहीं। एक मैच स्टेटमेंट एक विशिष्ट दस्तावेज़ को इंगित कर सकता है, जैसे कि match /cities/SF या वाइल्डकार्ड का उपयोग निर्दिष्ट पथ में किसी भी दस्तावेज़ को इंगित करने के लिए, जैसे कि match /cities/{city} में।

ऊपर के उदाहरण में, मैच स्टेटमेंट {city} वाइल्डकार्ड सिंटैक्स का उपयोग करता है। इसका मतलब यह है कि नियम cities के संग्रह में किसी भी दस्तावेज़ पर लागू होता है, जैसे /cities/SF या /cities/NYC । जब मिलान विवरण में allow अभिव्यक्तियों का मूल्यांकन किया जाता है, तो city चर शहर के दस्तावेज़ नाम, जैसे कि SF या NYC के अनुरूप हो जाएगा।

उपसंग्रहों का मिलान

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 के संग्रह में दस्तावेज़ों से मेल खाता है।

आपको 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() अनुरोध के अनुसार कॉल करें
  • 10 एकल-दस्तावेज़ अनुरोधों और क्वेरी अनुरोधों के लिए।
  • 20 बहु-दस्तावेज़ पढ़ने, लेनदेन और बैच लिखने के लिए। 10 की पिछली सीमा भी प्रत्येक ऑपरेशन पर लागू होती है।

    उदाहरण के लिए, कल्पना करें कि आप 3 लेखन कार्यों के साथ एक बैच लिखने का अनुरोध बनाते हैं और आपके सुरक्षा नियम प्रत्येक लेखन को मान्य करने के लिए 2 दस्तावेज़ एक्सेस कॉल का उपयोग करते हैं। इस मामले में, प्रत्येक लेखन अपने 10 एक्सेस कॉलों में से 2 का उपयोग करता है और बैच लिखने का अनुरोध इसके 20 एक्सेस कॉलों में से 6 का उपयोग करता है।

किसी भी सीमा से अधिक परिणाम एक अनुमति अस्वीकृत त्रुटि में परिणाम देता है।

कुछ दस्तावेज़ एक्सेस कॉल को कैश किया जा सकता है, और कैश्ड कॉल को सीमा में नहीं गिना जाता है।

अधिकतम नेस्टेड match विवरण गहराई 10
पथ खंडों में अधिकतम पथ लंबाई, नेस्टेड match विवरण के एक सेट के भीतर अनुमत है 100
नेस्टेड match स्टेटमेंट के सेट के भीतर अधिकतम पथ कैप्चर वैरिएबल की अनुमति है 20
अधिकतम फ़ंक्शन कॉल गहराई 20
फ़ंक्शन तर्कों की अधिकतम संख्या 7
प्रति फ़ंक्शन let वेरिएबल बाइंडिंग की अधिकतम संख्या 10
पुनरावर्ती या चक्रीय फ़ंक्शन कॉल की अधिकतम संख्या 0 (अनुमति नहीं)
प्रति अनुरोध मूल्यांकन किए गए भावों की अधिकतम संख्या 1,000
एक नियम का अधिकतम आकार नियमों को दो आकार सीमाओं का पालन करना चाहिए:
  • फ़ायरबेस कंसोल से या सीएलआई से firebase deploy का उपयोग करके प्रकाशित नियम सेट टेक्स्ट स्रोत के आकार पर 256 केबी की सीमा।
  • संकलित नियमों के आकार पर 250 केबी की सीमा जिसके परिणामस्वरूप फायरबेस स्रोत को संसाधित करता है और इसे बैक-एंड पर सक्रिय बनाता है।

घन संग्रहण

बुनियादी संरचना

क्लाउड फायरस्टोर और क्लाउड स्टोरेज में फायरबेस सुरक्षा नियम निम्नलिखित संरचना और सिंटैक्स का उपयोग करते हैं:

service <<name>> {
  // Match the resource path.
  match <<path>> {
    // Allow the request if the following conditions are true.
    allow <<methods>> : if <<condition>>
  }
}

जब आप नियम बनाते हैं तो निम्नलिखित प्रमुख अवधारणाओं को समझना महत्वपूर्ण है:

  • अनुरोध: allow कथन में लागू की गई विधि या विधियाँ। ये वे तरीके हैं जिन्हें आप चलाने की अनुमति दे रहे हैं। मानक तरीके हैं: get करें, list बनाएं, create , update और deleteread और write की सुविधा के तरीके निर्दिष्ट डेटाबेस या भंडारण पथ पर व्यापक पढ़ने और लिखने की अनुमति देते हैं।
  • पथ: डेटाबेस या भंडारण स्थान, जिसे यूआरआई पथ के रूप में दर्शाया गया है।
  • नियम: allow कथन, जिसमें एक शर्त शामिल है जो अनुरोध की अनुमति देती है यदि यह सत्य का मूल्यांकन करती है।

मिलान पथ

क्लाउड स्टोरेज सुरक्षा नियम क्लाउड स्टोरेज में फाइलों तक पहुंचने के लिए उपयोग किए जाने वाले फ़ाइल पथ से match हैं। नियम सटीक पथ या वाइल्डकार्ड पथ से match सकते हैं, और नियमों को नेस्ट भी किया जा सकता है। यदि कोई मिलान नियम अनुरोध विधि की अनुमति नहीं देता है, या स्थिति का मूल्यांकन false होता है, तो अनुरोध अस्वीकार कर दिया जाता है।

सटीक मिलान

// Exact match for "images/profilePhoto.png"
match /images/profilePhoto.png {
  allow write: if <condition>;
}

// Exact match for "images/croppedProfilePhoto.png"
match /images/croppedProfilePhoto.png {
  allow write: if <other_condition>;
}

नेस्टेड मैच

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/profilePhoto.png"
  match /profilePhoto.png {
    allow write: if <condition>;
  }

  // Exact match for "images/croppedProfilePhoto.png"
  match /croppedProfilePhoto.png {
    allow write: if <other_condition>;
  }
}

वाइल्डकार्ड मैच

वाइल्डकार्ड का उपयोग करके पैटर्न का match करने के लिए नियमों का भी उपयोग किया जा सकता है। वाइल्डकार्ड एक नामित चर है जो या तो एक स्ट्रिंग का प्रतिनिधित्व करता है जैसे कि profilePhoto.png , या कई पथ खंड, जैसे कि images/profilePhoto.png

वाइल्डकार्ड नाम के चारों ओर घुंघराले ब्रेसिज़ जोड़कर एक वाइल्डकार्ड बनाया जाता है, जैसे {string} । वाइल्डकार्ड नाम में == =** जोड़कर एक बहु खंड वाइल्डकार्ड घोषित किया जा सकता है, जैसे {path=**} :

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/*"
  // e.g. images/profilePhoto.png is matched
  match /{imageId} {
    // This rule only matches a single path segment (*)
    // imageId is a string that contains the specific segment matched
    allow read: if <condition>;
  }

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

यदि एक से अधिक नियम एक फ़ाइल से मेल खाते हैं, तो परिणाम सभी नियमों के मूल्यांकन के परिणाम का OR होता है। यही है, यदि कोई नियम फ़ाइल से मेल खाता है तो true का मूल्यांकन होता है, परिणाम true होता है।

उपरोक्त नियमों में, फ़ाइल "images/profilePhoto.png" को तब पढ़ा जा सकता है जब या तो condition या other_condition का मूल्यांकन सही होता है, जबकि फ़ाइल "images/users/user:12345/profilePhoto.png" केवल other_condition के परिणाम के अधीन है .

फ़ाइल नाम या पथ प्राधिकरण प्रदान करने वाले match के भीतर से एक वाइल्डकार्ड चर का संदर्भ दिया जा सकता है:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

क्लाउड स्टोरेज सुरक्षा नियम कैस्केड नहीं होते हैं, और नियमों का मूल्यांकन केवल तभी किया जाता है जब अनुरोध पथ निर्दिष्ट नियमों के साथ पथ से मेल खाता हो।

मूल्यांकन का अनुरोध करें

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

request ऑब्जेक्ट में उपयोगकर्ता की विशिष्ट आईडी और फ़ायरबेस प्रमाणीकरण पेलोड भी शामिल है request.auth ऑब्जेक्ट, जिसे आगे दस्तावेज़ों के प्रमाणीकरण अनुभाग में समझाया जाएगा।

request वस्तु में गुणों की पूरी सूची नीचे उपलब्ध है:

संपत्ति टाइप विवरण
auth नक्शा<स्ट्रिंग, स्ट्रिंग> जब कोई उपयोगकर्ता लॉग इन होता है, तो uid , उपयोगकर्ता की विशिष्ट आईडी और token , फायरबेस प्रमाणीकरण जेडब्ल्यूटी दावों का एक नक्शा प्रदान करता है। अन्यथा, यह null हो जाएगा।
params नक्शा<स्ट्रिंग, स्ट्रिंग> अनुरोध के क्वेरी पैरामीटर युक्त नक्शा।
path रास्ता उस path का प्रतिनिधित्व करने वाला पथ जिस पर अनुरोध किया जा रहा है।
resource नक्शा<स्ट्रिंग, स्ट्रिंग> नया संसाधन मूल्य, केवल write के अनुरोध पर मौजूद है।
time TIMESTAMP सर्वर समय का प्रतिनिधित्व करने वाला एक टाइमस्टैम्प अनुरोध का मूल्यांकन किया जाता है।

संसाधन मूल्यांकन

नियमों का मूल्यांकन करते समय, आप अपलोड, डाउनलोड, संशोधित, या हटाई जा रही फ़ाइल के मेटाडेटा का मूल्यांकन भी कर सकते हैं। यह आपको जटिल और शक्तिशाली नियम बनाने की अनुमति देता है जो केवल कुछ सामग्री प्रकारों वाली फ़ाइलों को अपलोड करने की अनुमति देता है, या केवल एक निश्चित आकार से बड़ी फ़ाइलों को हटाने की अनुमति देता है।

क्लाउड स्टोरेज के लिए फायरबेस सुरक्षा नियम resource ऑब्जेक्ट में फ़ाइल मेटाडेटा प्रदान करते हैं, जिसमें क्लाउड स्टोरेज ऑब्जेक्ट में सामने आए मेटाडेटा के कुंजी/मान जोड़े होते हैं। डेटा अखंडता सुनिश्चित करने के लिए read या write के अनुरोधों पर इन गुणों का निरीक्षण किया जा सकता है।

अनुरोध write पर (जैसे अपलोड, मेटाडेटा अपडेट और डिलीट), resource ऑब्जेक्ट के अलावा, जिसमें फ़ाइल के लिए फ़ाइल मेटाडेटा शामिल है जो वर्तमान में अनुरोध पथ पर मौजूद है, आपके पास request.resource ऑब्जेक्ट का उपयोग करने की क्षमता भी है, जिसमें फ़ाइल मेटाडेटा का एक सबसेट होता है जिसे लिखने की अनुमति होने पर लिखा जाना है। आप डेटा अखंडता सुनिश्चित करने या फ़ाइल प्रकार या आकार जैसी एप्लिकेशन बाधाओं को लागू करने के लिए इन दो मानों का उपयोग कर सकते हैं।

resource वस्तु में गुणों की पूरी सूची नीचे उपलब्ध है:

संपत्ति टाइप विवरण
name डोरी वस्तु का पूरा नाम
bucket डोरी उस बाल्टी का नाम जिसमें यह वस्तु रहती है।
generation पूर्णांक इस ऑब्जेक्ट का Google क्लाउड स्टोरेज ऑब्जेक्ट जनरेशन
metageneration पूर्णांक इस ऑब्जेक्ट का Google क्लाउड स्टोरेज ऑब्जेक्ट मेटाजेनरेशन
size पूर्णांक वस्तु का आकार बाइट्स में।
timeCreated TIMESTAMP एक टाइमस्टैम्प उस समय का प्रतिनिधित्व करता है जब कोई वस्तु बनाई गई थी।
updated TIMESTAMP एक टाइमस्टैम्प उस समय का प्रतिनिधित्व करता है जब किसी ऑब्जेक्ट को अंतिम बार अपडेट किया गया था।
md5Hash डोरी वस्तु का MD5 हैश।
crc32c डोरी वस्तु का एक crc32c हैश।
etag डोरी इस वस्तु से जुड़ा ईटैग।
contentDisposition डोरी इस वस्तु से संबद्ध सामग्री स्वभाव।
contentEncoding डोरी इस ऑब्जेक्ट से संबद्ध सामग्री एन्कोडिंग।
contentLanguage डोरी इस वस्तु से जुड़ी सामग्री भाषा।
contentType डोरी इस ऑब्जेक्ट से संबद्ध सामग्री प्रकार।
metadata नक्शा<स्ट्रिंग, स्ट्रिंग> अतिरिक्त, डेवलपर द्वारा निर्दिष्ट कस्टम मेटाडेटा के कुंजी/मान जोड़े।

request.resource में generation , metageneration , etag , timeCreated , और updated के अपवाद के साथ ये सभी शामिल हैं।

सुरक्षा नियम सीमा

सुरक्षा नियमों के साथ काम करते समय, निम्नलिखित सीमाओं पर ध्यान दें:

सीमा विवरण
प्रति अनुरोध firestore.exists() और firestore.get() कॉल की अधिकतम संख्या

2 एकल-दस्तावेज़ अनुरोधों और क्वेरी अनुरोधों के लिए।

इस सीमा से अधिक होने पर अनुमति अस्वीकृत त्रुटि होती है।

समान दस्तावेज़ों तक पहुँच कॉल को कैश किया जा सकता है, और कैश्ड कॉल की सीमा में गणना नहीं की जाती है।

पूरा उदाहरण

यह सब एक साथ रखकर, आप छवि संग्रहण समाधान के लिए नियमों का एक पूर्ण उदाहरण बना सकते हैं:

service firebase.storage {
 match /b/{bucket}/o {
   match /images {
     // Cascade read to any image type at any path
     match /{allImages=**} {
       allow read;
     }

     // Allow write files to the path "images/*", subject to the constraints:
     // 1) File is less than 5MB
     // 2) Content type is an image
     // 3) Uploaded content type matches existing content type
     // 4) File name (stored in imageId wildcard variable) is less than 32 characters
     match /{imageId} {
       allow write: if request.resource.size < 5 * 1024 * 1024
                    && request.resource.contentType.matches('image/.*')
                    && request.resource.contentType == resource.contentType
                    && imageId.size() < 32
     }
   }
 }
}

रीयलटाइम डेटाबेस

बुनियादी संरचना

रीयलटाइम डेटाबेस में, Firebase सुरक्षा नियमों में JSON दस्तावेज़ में मौजूद JavaScript जैसे भाव होते हैं।

वे निम्नलिखित सिंटैक्स का उपयोग करते हैं:

{
  "rules": {
    "<<path>>": {
    // Allow the request if the condition for each method is true.
      ".read": <<condition>>,
      ".write": <<condition>>,
      ".validate": <<condition>>
    }
  }
}

नियम में तीन बुनियादी तत्व हैं:

  • पथ: डेटाबेस स्थान। यह आपके डेटाबेस की JSON संरचना को प्रतिबिंबित करता है।
  • अनुरोध: ये वे तरीके हैं जिनका उपयोग नियम पहुँच प्रदान करने के लिए करता है। read और write के नियम व्यापक पढ़ने और लिखने की पहुंच प्रदान करते हैं, जबकि validate नियम आने वाले या मौजूदा डेटा के आधार पर पहुंच प्रदान करने के लिए द्वितीयक सत्यापन के रूप में कार्य करते हैं।
  • शर्त: वह शर्त जो अनुरोध की अनुमति देती है यदि वह सत्य का मूल्यांकन करता है।

पथों पर नियम कैसे लागू होते हैं

रीयलटाइम डेटाबेस में, नियम परमाणु रूप से लागू होते हैं, जिसका अर्थ है कि उच्च-स्तरीय पैरेंट नोड्स पर नियम अधिक दानेदार चाइल्ड नोड्स पर नियमों को ओवरराइड करते हैं और गहरे नोड पर नियम पैरेंट पथ तक पहुंच प्रदान नहीं कर सकते हैं। यदि आप इसे पहले से ही मूल पथों में से किसी एक के लिए प्रदान कर चुके हैं तो आप अपने डेटाबेस संरचना में गहरे पथ पर पहुंच को परिशोधित या निरस्त नहीं कर सकते हैं।

निम्नलिखित नियमों पर विचार करें:

{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          // ignored, since read was allowed already
          ".read": false
        }
     }
  }
}

यह सुरक्षा संरचना /bar/ को तब से पढ़ने की अनुमति देती है जब भी /foo/ में मान true वाला चाइल्ड baz होता है। ".read": /foo/bar/ के तहत ".read": false नियम का यहां कोई प्रभाव नहीं पड़ता है, क्योंकि चाइल्ड पाथ द्वारा एक्सेस को निरस्त नहीं किया जा सकता है।

हालांकि यह तुरंत सहज ज्ञान युक्त नहीं लग सकता है, यह नियम भाषा का एक शक्तिशाली हिस्सा है और न्यूनतम प्रयास के साथ बहुत जटिल पहुंच विशेषाधिकारों को लागू करने की अनुमति देता है। यह उपयोगकर्ता-आधारित सुरक्षा के लिए विशेष रूप से उपयोगी है।

हालांकि, .validate नियम कैस्केड नहीं करते हैं। लिखने की अनुमति के लिए सभी मान्य नियमों को पदानुक्रम के सभी स्तरों पर संतुष्ट होना चाहिए।

इसके अतिरिक्त, क्योंकि नियम वापस पैरेंट पथ पर लागू नहीं होते हैं, यदि अनुरोधित स्थान पर या एक्सेस प्रदान करने वाले पैरेंट स्थान पर कोई नियम नहीं है, तो पढ़ने या लिखने का कार्य विफल हो जाता है। भले ही हर प्रभावित चाइल्ड पथ पहुंच योग्य हो, मूल स्थान पर पढ़ना पूरी तरह से विफल हो जाएगा। इस संरचना पर विचार करें:

{
  "rules": {
    "records": {
      "rec1": {
        ".read": true
      },
      "rec2": {
        ".read": false
      }
    }
  }
}

यह समझे बिना कि नियमों का मूल्यांकन परमाणु रूप से किया जाता है, ऐसा लग सकता है कि /records/ पथ लाने से rec1 वापस आ जाएगा लेकिन rec2 नहीं। हालाँकि, वास्तविक परिणाम एक त्रुटि है:

जावास्क्रिप्ट
var db = firebase.database();
db.ref("records").once("value", function(snap) {
  // success method is not called
}, function(err) {
  // error callback triggered with PERMISSION_DENIED
});
उद्देश्य सी
नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[_ref child:@"records"] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
  // success block is not called
} withCancelBlock:^(NSError * _Nonnull error) {
  // cancel block triggered with PERMISSION_DENIED
}];
तीव्र
नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
var ref = FIRDatabase.database().reference()
ref.child("records").observeSingleEventOfType(.Value, withBlock: { snapshot in
    // success block is not called
}, withCancelBlock: { error in
    // cancel block triggered with PERMISSION_DENIED
})
जावा
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("records");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    // success method is not called
  }

  @Override
  public void onCancelled(FirebaseError firebaseError) {
    // error callback triggered with PERMISSION_DENIED
  });
});
विश्राम
curl https://docs-examples.firebaseio.com/rest/records/
# response returns a PERMISSION_DENIED error

चूंकि /records/ पर रीड ऑपरेशन परमाणु है, और ऐसा कोई पठन नियम नहीं है जो /records/ के तहत सभी डेटा तक पहुंच प्रदान करता है, यह एक PERMISSION_DENIED त्रुटि फेंक देगा। यदि हम अपने फायरबेस कंसोल में सुरक्षा सिम्युलेटर में इस नियम का मूल्यांकन करते हैं, तो हम देख सकते हैं कि रीड ऑपरेशन को अस्वीकार कर दिया गया था:

Attempt to read /records with auth=Success(null)
    /
    /records

No .read rule allowed the operation.
Read was denied.

ऑपरेशन को अस्वीकार कर दिया गया था क्योंकि किसी भी पठन नियम ने /records/ पथ तक पहुंच की अनुमति नहीं दी थी, लेकिन ध्यान दें कि rec1 के नियम का मूल्यांकन कभी नहीं किया गया था क्योंकि यह हमारे द्वारा अनुरोधित पथ में नहीं था। rec1 लाने के लिए, हमें इसे सीधे एक्सेस करना होगा:

जावास्क्रिप्ट
var db = firebase.database();
db.ref("records/rec1").once("value", function(snap) {
  // SUCCESS!
}, function(err) {
  // error callback is not called
});
उद्देश्य सी
नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[ref child:@"records/rec1"] observeSingleEventOfType:FEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
    // SUCCESS!
}];
तीव्र
नोट: यह फायरबेस उत्पाद ऐप क्लिप लक्ष्य पर उपलब्ध नहीं है।
var ref = FIRDatabase.database().reference()
ref.child("records/rec1").observeSingleEventOfType(.Value, withBlock: { snapshot in
    // SUCCESS!
})
जावा
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("records/rec1");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    // SUCCESS!
  }

  @Override
  public void onCancelled(FirebaseError firebaseError) {
    // error callback is not called
  }
});
विश्राम
curl https://docs-examples.firebaseio.com/rest/records/rec1
# SUCCESS!

स्थान चर

रीयलटाइम डेटाबेस नियम पथ खंडों से मेल खाने के लिए $location चर का समर्थन करते हैं। पथ के किसी भी चाइल्ड नोड से अपने नियम का मिलान करने के लिए अपने पथ खंड के सामने $ उपसर्ग का उपयोग करें।

  {
    "rules": {
      "rooms": {
        // This rule applies to any child of /rooms/, the key for each room id
        // is stored inside $room_id variable for reference
        "$room_id": {
          "topic": {
            // The room's topic can be changed if the room id has "public" in it
            ".write": "$room_id.contains('public')"
          }
        }
      }
    }
  }

आप निरंतर पथ नामों के साथ समानांतर में $variable का भी उपयोग कर सकते हैं।

  {
    "rules": {
      "widget": {
        // a widget can have a title or color attribute
        "title": { ".validate": true },
        "color": { ".validate": true },

        // but no other child paths are allowed
        // in this case, $other means any key excluding "title" and "color"
        "$other": { ".validate": false }
      }
    }
  }