ऐप्लिकेशन डेवलप करने से जुड़ी पहेली में सुरक्षा जानना, सबसे मुश्किल कामों में से एक हो सकता है. ज़्यादातर ऐप्लिकेशन में, डेवलपर को ऐसा सर्वर बनाना और चलाना चाहिए प्रमाणीकरण (उपयोगकर्ता कौन है) और प्राधिकरण (उपयोगकर्ता क्या कर सकता है) को संभालता है.
Firebase Security Rules मिडल (सर्वर) लेयर हटाएं और सीधे आपके डेटा से कनेक्ट करने वाले क्लाइंट के लिए, पाथ के आधार पर अनुमतियां तय करने की अनुमति दें. आने वाले अनुरोधों पर नियम कैसे लागू होते हैं, इस बारे में ज़्यादा जानने के लिए इस गाइड का इस्तेमाल करें.
किसी प्रॉडक्ट के नियमों के बारे में ज़्यादा जानने के लिए, उसे चुनें.
Cloud Firestore
बुनियादी स्ट्रक्चर
Cloud Firestore और Cloud Storage में Firebase Security Rules इस स्ट्रक्चर का इस्तेमाल करते हैं और सिंटैक्स:
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
, औरdelete
.read
औरwrite
सुविधा के तरीके दिए गए डेटाबेस या स्टोरेज पाथ के लिए, पढ़ने और लिखने का ऐक्सेस चालू करें. - पाथ: डेटाबेस या स्टोरेज की जगह, जिसे यूआरआई पाथ.
- नियम:
allow
स्टेटमेंट, जिसमें एक शर्त शामिल होती है. अगर यह शर्त सही होती है, तो अनुरोध को अनुमति दी जाती है.
सुरक्षा के नियम वर्शन 2
मई 2019 से, Firebase के सुरक्षा नियमों का वर्शन 2 अब उपलब्ध है
उपलब्ध हैं. नियमों के दूसरे वर्शन में, बार-बार इस्तेमाल होने वाले वाइल्डकार्ड {name=**}
के काम करने का तरीका बदला गया है. अगर आपको
कलेक्शन ग्रुप क्वेरी का इस्तेमाल करें. आपको इसके लिए ऑप्ट-इन करना होगा
rules_version = '2';
को अपनी सुरक्षा में पहली लाइन बनाकर, वर्शन 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';
को जोड़कर, वर्शन 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() कॉल की संख्या |
सीमा से ज़्यादा नतीजे पाने पर, अनुमति नहीं मिलने की गड़बड़ी दिखेगी. कुछ दस्तावेज़ ऐक्सेस कॉल कैश मेमोरी में सेव किए जा सकते हैं, और कैश मेमोरी में सेव किए गए कॉल, इन सीमाओं के दायरे में नहीं आते हैं. |
नेस्ट किए गए match स्टेटमेंट की ज़्यादा से ज़्यादा गहराई |
10 |
पथ सेगमेंट में, नेस्ट किए गए सेट में अधिकतम संख्यात्मक विश्लेषण की अनुमति है
match के स्टेटमेंट |
100 |
नेस्ट किए गए match स्टेटमेंट के सेट में, पाथ कैप्चर वैरिएबल की ज़्यादा से ज़्यादा संख्या |
20 |
अधिकतम फ़ंक्शन कॉल डेप्थ | 20 |
फ़ंक्शन के आर्ग्युमेंट की ज़्यादा से ज़्यादा संख्या | 7 |
हर फ़ंक्शन के लिए let वैरिएबल बाइंडिंग की ज़्यादा से ज़्यादा संख्या |
10 |
बार-बार होने वाले या साइक्लिकल फ़ंक्शन कॉल की ज़्यादा से ज़्यादा संख्या | 0 (अनुमति नहीं है) |
हर अनुरोध के लिए आकलन किए गए एक्सप्रेशन की ज़्यादा से ज़्यादा संख्या | 1,000 |
नियमसेट का ज़्यादा से ज़्यादा साइज़ | नियमों के सेट का साइज़, इन दो सीमाओं के अंदर होना चाहिए:
|
Cloud Storage
बुनियादी स्ट्रक्चर
Cloud Firestore और Cloud Storage में Firebase Security Rules इस स्ट्रक्चर का इस्तेमाल करते हैं और सिंटैक्स:
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
, औरdelete
.read
औरwrite
सुविधा के तरीके दिए गए डेटाबेस या स्टोरेज पाथ के लिए, पढ़ने और लिखने का ऐक्सेस चालू करें. - पाथ: डेटाबेस या स्टोरेज की जगह, जिसे यूआरआई पाथ.
- नियम:
allow
स्टेटमेंट, जिसमें ऐसी शर्त शामिल होती है जो अनुरोध करें.
मिलते-जुलते पाथ
Cloud Storage Security Rules match
Cloud Storage में फ़ाइलों को ऐक्सेस करने के लिए इस्तेमाल किए जाने वाले फ़ाइल पाथ. नियम में सटीक पाथ या वाइल्डकार्ड पाथ 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"; }
Cloud Storage Security Rules कैस्केड नहीं करते. साथ ही, नियमों का आकलन सिर्फ़ तब किया जाता है, जब अनुरोध पाथ, बताए गए नियमों वाले पाथ से मेल खाता हो.
आकलन का अनुरोध करना
अपलोड, डाउनलोड, मेटाडेटा में बदलाव, और मिटाए गए डेटा का आकलन, Cloud Storage पर भेजे गए request
का इस्तेमाल करके किया जाता है. request
वैरिएबल में
वह फ़ाइल पाथ जहां अनुरोध किया जा रहा है, वह समय जब अनुरोध किया जाता है
मिला है और अगर अनुरोध कोई अनुरोध है, तो resource
की नई वैल्यू. एचटीटीपी हेडर और पुष्टि की स्थिति भी शामिल है.
request
ऑब्जेक्ट में उपयोगकर्ता का यूनीक आईडी और request.auth
ऑब्जेक्ट में Firebase Authentication पेलोड भी होता है. इस बारे में ज़्यादा जानकारी, दस्तावेज़ों के पुष्टि सेक्शन में दी गई है.
request
ऑब्जेक्ट में प्रॉपर्टी की पूरी सूची नीचे दी गई है:
प्रॉपर्टी | टाइप | ब्यौरा |
---|---|---|
auth |
map<string, string> | जब कोई उपयोगकर्ता लॉग इन होता है, तो उपयोगकर्ता का uid , यूनीक आईडी, और
token , Firebase Authentication JWT दावों का मैप. ऐसा न करने पर, यह
null होगा. |
params |
मैप<स्ट्रिंग, स्ट्रिंग> | अनुरोध के क्वेरी पैरामीटर वाला मैप. |
path |
पाथ | path , उस पाथ को दिखाता है जहां अनुरोध किया जा रहा है. |
resource |
map<string, string> | नई संसाधन वैल्यू, सिर्फ़ write अनुरोध पर मौजूद है.
|
time |
timestamp | अनुरोध का आकलन करने के लिए सर्वर के समय को दिखाने वाला टाइमस्टैंप. |
संसाधन का आकलन
नियमों का मूल्यांकन करते समय, हो सकता है कि आप फ़ाइल के मेटाडेटा का मूल्यांकन भी करना चाहें अपलोड, डाउनलोड, संशोधित या हटाया जा रहा है. इसकी मदद से, जटिल और शक्तिशाली नियम जो ऐसे काम करते हैं जैसे कुछ फ़ाइलों को अपलोड किया जाने वाला कॉन्टेंट टाइप या सिर्फ़ एक तय साइज़ से बड़ी फ़ाइलें हटाया गया.
Cloud Storage के लिए Firebase Security Rules, resource
में फ़ाइल मेटाडेटा उपलब्ध कराता है
ऑब्जेक्ट है, जिसमें
Cloud Storage ऑब्जेक्ट. इन प्रॉपर्टी की जांच read
पर की जा सकती है या
डेटा के रखरखाव को पक्का करने के लिए write
अनुरोध.
write
अनुरोधों (जैसे, अपलोड, मेटाडेटा अपडेट, और मिटाना) पर, resource
ऑब्जेक्ट के अलावा, आपके पास request.resource
ऑब्जेक्ट का इस्तेमाल करने का विकल्प भी होता है. resource
ऑब्जेक्ट में, फ़ाइल के उस मेटाडेटा की जानकारी होती है जो फ़िलहाल अनुरोध पाथ पर मौजूद है. वहीं, request.resource
ऑब्जेक्ट में, फ़ाइल के उस मेटाडेटा का सबसेट होता है जिसे लिखने की अनुमति होने पर लिखा जाता है. यह पक्का करने के लिए कि डेटा
इंटिग्रिटी की अनुमति दें या ऐप्लिकेशन की पाबंदियां लागू करें. जैसे, फ़ाइल टाइप या साइज़.
resource
ऑब्जेक्ट में प्रॉपर्टी की पूरी सूची नीचे दी गई है:
प्रॉपर्टी | टाइप | ब्यौरा |
---|---|---|
name |
स्ट्रिंग | ऑब्जेक्ट का पूरा नाम |
bucket |
स्ट्रिंग | उस बकेट का नाम जिसमें यह ऑब्जेक्ट मौजूद है. |
generation |
int | इस ऑब्जेक्ट का Google Cloud Storage ऑब्जेक्ट जनरेशन. |
metageneration |
int | इस ऑब्जेक्ट का Google Cloud Storage ऑब्जेक्ट मेटाजनरेशन. |
size |
int | ऑब्जेक्ट का साइज़, बाइट में. |
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 } } } }
Realtime Database
बुनियादी स्ट्रक्चर
Realtime Database में, Firebase Security Rules में JavaScript जैसे एक्सप्रेशन होते हैं. JSON दस्तावेज़.
इसके लिए, इस सिंटैक्स का इस्तेमाल किया जाता है:
{
"rules": {
"<<path>>": {
// Allow the request if the condition for each method is true.
".read": <<condition>>,
".write": <<condition>>,
".validate": <<condition>>
}
}
}
इस नियम में तीन बुनियादी एलिमेंट होते हैं:
- पाथ: डेटाबेस की जगह. यह आपके डेटाबेस के JSON के स्ट्रक्चर की कॉपी बनाता है.
- अनुरोध: नियम ऐक्सेस देने के लिए इन तरीकों का इस्तेमाल करता है.
read
औरwrite
नियम, पढ़ने और लिखने का ऐक्सेस देते हैं, जबकिvalidate
नियम के आधार पर ऐक्सेस देने के लिए, सेकंडरी पुष्टि के तौर पर काम करें: डेटा शामिल है. - शर्त: यह शर्त, अनुरोध को तब अनुमति देती है, जब वह सही हो.
नियम, पाथ पर कैसे लागू होते हैं
Realtime Database में, Rules अपने आप लागू होता है, जिसका मतलब है कि नियम ऊंचे लेवल के पैरंट नोड, ज़्यादा जानकारी वाले चाइल्ड नोड पर नियमों को बदल देते हैं और ज़्यादा गहरे नोड पर मौजूद नियम, पैरंट पाथ को ऐक्सेस नहीं दे सकते. आपने लोगों तक पहुंचाया मुफ़्त में आपके डेटाबेस के स्ट्रक्चर में ज़्यादा डीप पाथ से, ऐक्सेस को बेहतर या निरस्त नहीं कर सकता, अगर आपने इसे किसी पैरंट पाथ के लिए पहले ही अनुमति दे दी है.
इन नियमों को ध्यान में रखें:
{ "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
शामिल है.
/foo/bar/
के तहत ".read": false
नियम में ऐसा नहीं है
यहां इफ़ेक्ट लागू होता है, क्योंकि चाइल्ड पाथ से ऐक्सेस को रद्द नहीं किया जा सकता.
भले ही यह आपको तुरंत सहज न लगे, लेकिन यह नियमों की भाषा और बहुत जटिल ऐक्सेस के खास अधिकारों को लागू करने की अनुमति देता है वह भी कम से कम मेहनत में. यह खास तौर पर उपयोगकर्ता पर आधारित सुरक्षा के लिए मददगार है.
हालांकि, .validate
नियम कैस्केड नहीं होते हैं. सभी पुष्टि करने वाले नियम
किसी लिखने की अनुमति के लिए, ज़रूरी है कि वह हैरारकी के सभी लेवल पर पूरा हो.
इसके अलावा, क्योंकि नियम पैरंट पाथ पर वापस लागू नहीं होते, इसलिए पढ़ें या लिखें अगर अनुरोध की गई जगह या किसी पैरंट जगह पर कोई नियम नहीं है, तो कार्रवाई नहीं की जा सकती ऐक्सेस देती है. भले ही, हर उस चाइल्ड पाथ को ऐक्सेस किया जा सकता हो जिस पर असर पड़ा है, मूल स्थान पर पढ़ना पूरी तरह से विफल हो जाएगा. इस स्ट्रक्चर को ध्यान में रखें:
{ "rules": { "records": { "rec1": { ".read": true }, "rec2": { ".read": false } } } }
नियमों का मूल्यांकन अपने आप होने वाले तरीके से किए जाने पर, ऐसा लग सकता है कि
/records/
पाथ फ़ेच करने पर, rec1
दिखेगा
लेकिन rec2
नहीं. हालांकि, असल नतीजा एक गड़बड़ी है:
JavaScript
var db = firebase.database(); db.ref("records").once("value", function(snap) { // success method is not called }, function(err) { // error callback triggered with PERMISSION_DENIED });
Objective-C
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 }];
Swift
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 })
Java
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 }); });
REST
curl https://docs-examples.firebaseio.com/rest/records/ # response returns a PERMISSION_DENIED error
/records/
में, डेटा पढ़ने की कार्रवाई एक बार में पूरी होती है. साथ ही, /records/
में मौजूद सभी डेटा को ऐक्सेस करने की अनुमति देने वाला कोई नियम नहीं है. इसलिए, इससे PERMISSION_DENIED
गड़बड़ी का मैसेज दिखेगा. अगर हम अपने Firebase कंसोल में सुरक्षा सिम्युलेटर में इस नियम का आकलन करते हैं, तो हमें पता चलता है कि पढ़ने की अनुमति नहीं दी गई थी:
Attempt to read /records with auth=Success(null) / /records No .read rule allowed the operation. Read was denied.
कार्रवाई अस्वीकार कर दी गई, क्योंकि पढ़ने के लिए बने किसी भी नियम ने /records/
पाथ को ऐक्सेस करने की अनुमति नहीं दी. हालांकि, ध्यान दें कि rec1
के लिए बने नियम का कभी आकलन नहीं किया गया, क्योंकि वह उस पाथ में नहीं था जिसके लिए हमने अनुरोध किया था. rec1
को फ़ेच करने के लिए, हमें इसे सीधे ऐक्सेस करना होगा:
JavaScript
var db = firebase.database(); db.ref("records/rec1").once("value", function(snap) { // SUCCESS! }, function(err) { // error callback is not called });
Objective-C
FIRDatabaseReference *ref = [[FIRDatabase database] reference]; [[ref child:@"records/rec1"] observeSingleEventOfType:FEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { // SUCCESS! }];
Swift
var ref = FIRDatabase.database().reference() ref.child("records/rec1").observeSingleEventOfType(.Value, withBlock: { snapshot in // SUCCESS! })
Java
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 } });
REST
curl https://docs-examples.firebaseio.com/rest/records/rec1 # SUCCESS!
लोकेशन वैरिएबल
Realtime Database Rules $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 }
}
}
}