यह गाइड सुरक्षा के नियम बनाने से जुड़ी गाइड पर आधारित है Cloud Firestore Security Rules में शर्तें जोड़ने का तरीका दिखाने के लिए. अगर आप नहीं हैं Cloud Firestore Security Rules की मूलभूत बातों से परिचित हैं, तो शुरुआत करना देखें पढ़ें.
Cloud Firestore Security Rules का मुख्य बिल्डिंग ब्लॉक, शर्त है. शर्त एक बूलियन एक्सप्रेशन है. इससे यह तय होता है कि किसी खास कार्रवाई को अनुमति दी जानी चाहिए या नहीं. ऐसी शर्तें लिखने के लिए सुरक्षा नियमों का इस्तेमाल करें जो उपयोगकर्ता की पुष्टि करना, आने वाले डेटा की पुष्टि करना, और यहां तक कि आपका डेटाबेस.
पुष्टि करना
सुरक्षा नियम के सबसे सामान्य पैटर्न में से एक, उपयोगकर्ता की पुष्टि की स्थिति के आधार पर ऐक्सेस को कंट्रोल करना है. उदाहरण के लिए, हो सकता है कि आपका ऐप्लिकेशन सिर्फ़ डेटा लिखने के लिए प्रवेश किए हुए उपयोगकर्ता:
service cloud.firestore {
match /databases/{database}/documents {
// Allow the user to access documents in the "cities" collection
// only if they are authenticated.
match /cities/{city} {
allow read, write: if request.auth != null;
}
}
}
एक और सामान्य पैटर्न यह पक्का करना है कि उपयोगकर्ता सिर्फ़ अपना डेटा पढ़ और लिख सकें:
service cloud.firestore {
match /databases/{database}/documents {
// Make sure the uid of the requesting user matches name of the user
// document. The wildcard expression {userId} makes the userId variable
// available in rules.
match /users/{userId} {
allow read, update, delete: if request.auth != null && request.auth.uid == userId;
allow create: if request.auth != null;
}
}
}
अगर आपका ऐप्लिकेशन, Firebase से पुष्टि करने की सुविधा या Google Cloud Identity Platform का इस्तेमाल करता है, तो request.auth
वैरिएबल में
डेटा का अनुरोध करने वाले क्लाइंट की पुष्टि करने से जुड़ी जानकारी.
request.auth
के बारे में ज़्यादा जानकारी के लिए, रेफ़रंस देखें
दस्तावेज़.
डेटा सत्यापन
कई ऐप्लिकेशन, ऐक्सेस कंट्रोल की जानकारी को डेटाबेस में दस्तावेज़ों के फ़ील्ड के तौर पर सेव करते हैं. दस्तावेज़ के आधार पर, Cloud Firestore Security Rules डाइनैमिक तौर पर ऐक्सेस की अनुमति दे सकता है या उसे अस्वीकार कर सकता है डेटा:
service cloud.firestore {
match /databases/{database}/documents {
// Allow the user to read data if the document has the 'visibility'
// field set to 'public'
match /cities/{city} {
allow read: if resource.data.visibility == 'public';
}
}
}
resource
वैरिएबल, अनुरोध किए गए दस्तावेज़ को दिखाता है. साथ ही, resource.data
दस्तावेज़ में सेव किए गए सभी फ़ील्ड और वैल्यू का मैप होता है. resource
वैरिएबल के बारे में ज़्यादा जानकारी के लिए, रेफ़रंस दस्तावेज़ देखें.
डेटा लिखते समय, हो सकता है कि आप इनकमिंग डेटा की तुलना मौजूदा डेटा से करना चाहें.
इस मामले में, अगर आपका नियमसेट लंबित लिखने की अनुमति देता है, तो request.resource
वैरिएबल में दस्तावेज़ की आने वाले समय की स्थिति शामिल होती है. update
ऑपरेशन के लिए, सिर्फ़ दस्तावेज़ के फ़ील्ड के सबसेट में बदलाव किया जाता है. ऑपरेशन के बाद, request.resource
वैरिएबल में दस्तावेज़ की वह स्थिति होगी जिसे मंज़ूरी मिलना बाकी है. आपके पास
अनचाहे या अलग-अलग डेटा अपडेट को रोकने के लिए, request.resource
में दी गई वैल्यू:
service cloud.firestore {
match /databases/{database}/documents {
// Make sure all cities have a positive population and
// the name is not changed
match /cities/{city} {
allow update: if request.resource.data.population > 0
&& request.resource.data.name == resource.data.name;
}
}
}
अन्य दस्तावेज़ों को ऐक्सेस करें
get()
और exists()
फ़ंक्शन का इस्तेमाल करके, आपके सुरक्षा नियम आकलन कर सकते हैं
डेटाबेस में मौजूद अन्य दस्तावेज़ों के लिए मिले अनुरोध. get()
और
exists()
फ़ंक्शन, दोनों के लिए दस्तावेज़ के पूरे पाथ की जानकारी देना ज़रूरी है. इसका इस्तेमाल करते समय
वैरिएबल का इस्तेमाल करके, get()
और exists()
का पाथ बनाना है, तो आपको
$(variable)
सिंटैक्स का इस्तेमाल करके एस्केप वैरिएबल.
नीचे दिए गए उदाहरण में, मैच से database
वैरिएबल को कैप्चर किया गया है
स्टेटमेंट match /databases/{database}/documents
और इसका इस्तेमाल पाथ बनाने के लिए किया जाता है:
service cloud.firestore {
match /databases/{database}/documents {
match /cities/{city} {
// Make sure a 'users' document exists for the requesting user before
// allowing any writes to the 'cities' collection
allow create: if request.auth != null && exists(/databases/$(database)/documents/users/$(request.auth.uid));
// Allow the user to delete cities if their user document has the
// 'admin' field set to 'true'
allow delete: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
}
}
}
लिखने के लिए, आप getAfter()
फ़ंक्शन का इस्तेमाल करके
दस्तावेज़ लेन-देन या राइट के बैच के पूरा होने के बाद, लेकिन
ट्रांज़ैक्शन या बैच कमिटमेंट. get()
की तरह, getAfter()
फ़ंक्शन
दस्तावेज़ का पाथ. लिखने के सेट तय करने के लिए, getAfter()
का इस्तेमाल किया जा सकता है
जो किसी लेन-देन या बैच के रूप में एक साथ लिए जा सकते हैं.
कॉल की सीमाएं ऐक्सेस करना
हर नियम सेट के आकलन के लिए, दस्तावेज़ के ऐक्सेस कॉल की सीमा तय होती है:
- एक दस्तावेज़ के अनुरोध और क्वेरी के अनुरोध के लिए 10.
-
एक से ज़्यादा दस्तावेज़ पढ़ने, लेन-देन, और बैच में लिखें. 10 की पिछली सीमा प्रत्येक पर भी लागू होती है कार्रवाई.
उदाहरण के लिए, मान लें कि आपने एक साथ कई डेटा डालने के लिए, तीन डेटा डालने के ऑपरेशन वाला अनुरोध बनाया है. साथ ही, आपके सुरक्षा नियम, हर डेटा डालने की पुष्टि करने के लिए, दस्तावेज़ के ऐक्सेस के दो कॉल का इस्तेमाल करते हैं. इस मामले में, प्रत्येक लेखन अपने ऐक्सेस पाने के लिए 10 कॉल और एक बैच में लिखने का अनुरोध, 20 में से 6 ऐक्सेस का इस्तेमाल करता है कॉल.
इनमें से किसी भी सीमा को पार करने पर, 'अनुमति नहीं दी गई' गड़बड़ी का मैसेज दिखता है. कुछ दस्तावेज़ ऐक्सेस कॉल, कैश मेमोरी में सेव किए जा सकते हैं. साथ ही, कैश मेमोरी में सेव किए गए कॉल, इन सीमाओं में नहीं गिने जाते हैं.
इन सीमाओं से लेन-देन और एक साथ कई रिकॉर्ड लिखने की सुविधा पर क्या असर पड़ता है, इस बारे में ज़्यादा जानने के लिए एटॉमिक ऑपरेशन को सुरक्षित करने से जुड़ी गाइड देखें.
कॉल और कीमत ऐक्सेस करना
इन फ़ंक्शन का इस्तेमाल करने पर, आपके डेटाबेस में रीड ऑपरेशन लागू होता है, इसका मतलब है कि आपको दस्तावेज़ पढ़ने के लिए बिल भेजा जाएगा, भले ही नियम अस्वीकार हो जाएं अनुरोध किया है. Cloud Firestore की कीमत देखें देखें.
कस्टम फ़ंक्शन
जैसे-जैसे आपके सुरक्षा नियम ज़्यादा जटिल होते जाएंगे, वैसे-वैसे आप शर्तों में शामिल है, जिन्हें आप अपने नियमसेट में फिर से इस्तेमाल कर सकते हैं. सुरक्षा के नियमों में, पसंद के मुताबिक बनाए गए फ़ंक्शन इस्तेमाल किए जा सकते हैं. कस्टम फ़ंक्शन का सिंटैक्स कुछ-कुछ JavaScript जैसा है. लेकिन सुरक्षा नियमों के फ़ंक्शन डोमेन की खास भाषा में लिखे जाते हैं जिसमें कुछ अहम सीमाएं हैं:
- फ़ंक्शन में सिर्फ़ एक
return
स्टेटमेंट हो सकता है. वे नहीं कर सकते कोई अतिरिक्त लॉजिक हो सकता है. उदाहरण के लिए, वे लूप या कॉल नहीं कर सकते बाहरी सेवाओं को ऐक्सेस करने की अनुमति नहीं है. - फ़ंक्शन, स्कोप से फ़ंक्शन और वैरिएबल को अपने-आप ऐक्सेस कर सकते हैं
जिनमें उन्हें परिभाषित किया गया है. उदाहरण के लिए,
service cloud.firestore
स्कोप के पासresource
वैरिएबल का ऐक्सेस है और बिल्ट-इन फ़ंक्शन, जैसे किget()
औरexists()
. - फ़ंक्शन दूसरे फ़ंक्शन को कॉल कर सकते हैं, लेकिन हो सकता है कि वे बार-बार न हों. कॉल स्टैक की कुल गहराई 10 तक सीमित है.
- नियमों के
v2
वर्शन में, फ़ंक्शनlet
कीवर्ड का इस्तेमाल करके वैरिएबल तय कर सकते हैं. फ़ंक्शन में ज़्यादा से ज़्यादा 10 let बाइंडिंग हो सकती हैं. हालांकि, फ़ंक्शन को 'return' स्टेटमेंट के साथ खत्म करना ज़रूरी है.
फ़ंक्शन को function
कीवर्ड से तय किया जाता है और यह शून्य या उससे ज़्यादा लेता है
आर्ग्युमेंट. उदाहरण के लिए, हो सकता है कि आप ऊपर दिए गए उदाहरणों में इस्तेमाल की गई दो तरह की शर्तों को एक फ़ंक्शन में जोड़ना चाहें:
service cloud.firestore {
match /databases/{database}/documents {
// True if the user is signed in or the requested data is 'public'
function signedInOrPublic() {
return request.auth.uid != null || resource.data.visibility == 'public';
}
match /cities/{city} {
allow read, write: if signedInOrPublic();
}
match /users/{user} {
allow read, write: if signedInOrPublic();
}
}
}
सुरक्षा नियमों में फ़ंक्शन का इस्तेमाल करने से, नियमों को मैनेज करना आसान हो जाता है. ऐसा इसलिए, क्योंकि नियमों की जटिलता बढ़ जाती है.
नियम, फ़िल्टर नहीं होते
अपना डेटा सुरक्षित करने और क्वेरी लिखने के बाद, ध्यान रखें कि सुरक्षा के नियम, फ़िल्टर नहीं होते. आप इसमें मौजूद सभी दस्तावेज़ों के लिए क्वेरी नहीं लिख सकते: और उम्मीद करते हैं कि Cloud Firestore सिर्फ़ वही दस्तावेज़ लौटाएगा जो मौजूदा क्लाइंट के पास इसे ऐक्सेस करने की अनुमति है.
उदाहरण के लिए, सुरक्षा से जुड़ा यह नियम देखें:
service cloud.firestore {
match /databases/{database}/documents {
// Allow the user to read data if the document has the 'visibility'
// field set to 'public'
match /cities/{city} {
allow read: if resource.data.visibility == 'public';
}
}
}
अस्वीकार किया गया: नतीजे के सेट होने की वजह से, यह नियम नीचे दी गई क्वेरी को अस्वीकार कर देता है
इसमें ऐसे दस्तावेज़ शामिल किए जा सकते हैं जिनमें visibility
, public
नहीं है:
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है वेबसाइट
db.collection("cities").get() .then(function(querySnapshot) { querySnapshot.forEach(function(doc) { console.log(doc.id, " => ", doc.data()); }); });
अनुमति है: यह नियम इस क्वेरी की अनुमति देता है, क्योंकि where("visibility", "==", "public")
क्लॉज़ गारंटी देते हैं कि नतीजा सेट नियम की शर्त पूरी करता है:
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है वेबसाइट
db.collection("cities").where("visibility", "==", "public").get() .then(function(querySnapshot) { querySnapshot.forEach(function(doc) { console.log(doc.id, " => ", doc.data()); }); });
Cloud Firestore के सुरक्षा नियम, हर क्वेरी का आकलन उसके संभावित नतीजे के आधार पर करते हैं. अगर क्वेरी से ऐसा दस्तावेज़ मिल सकता है जिसे क्लाइंट पढ़ने की अनुमति नहीं है, तो अनुरोध अस्वीकार कर दिया जाता है. क्वेरी को भी नहीं बताया गया है. सुरक्षा के नियमों और क्वेरी के बारे में ज़्यादा जानकारी के लिए, सुरक्षित तरीके से जानकारी देखने की सुविधा देखें डेटा क्वेरी करना.
अगले चरण
- जानें कि सुरक्षा से जुड़े नियमों का आपकी क्वेरी पर क्या असर पड़ता है.
- सुरक्षा के नियम बनाने का तरीका जानें.
- सुरक्षा नियमों का रेफ़रंस पढ़ें.
- Cloud Storage for Firebase का इस्तेमाल करने वाले आपके ऐप्लिकेशन के लिए, लिखने का तरीका जानें Cloud Storage Security Rules शर्तें, जो Cloud Firestore दस्तावेज़ों को ऐक्सेस करती हैं.