Cloud Storage की भाषा के लिए Firebase के सुरक्षा नियमों से जुड़े मुख्य सिंटैक्स को जानें

Cloud Storage के लिए Firebase के सुरक्षा नियम, आपको स्टोर किए गए ऑब्जेक्ट के ऐक्सेस को कंट्रोल करने की अनुमति देते हैं Cloud Storage बकेट में. सुविधाजनक नियमों के सिंटैक्स की मदद से लिखे गए सभी आइटम से लेकर Cloud Storage तक, किसी भी कार्रवाई को कंट्रोल करने के नियम बकेट की मदद से किसी खास फ़ाइल पर कार्रवाई करें.

इस गाइड में, Cloud Storage के सुरक्षा नियमों के बुनियादी सिंटैक्स और स्ट्रक्चर के बारे में बताया गया है, ताकि पूरे नियमसेट बना सकता है.

सेवा और डेटाबेस का एलान करना

Cloud Storage के लिए Firebase के सुरक्षा नियम, हमेशा इस एलान से शुरू होते हैं:

service firebase.storage {
    // ...
}

service firebase.storage के एलान में, नियमों का दायरा इन कामों के लिए होता है Cloud Storage की मदद से, Cloud Storage के सुरक्षा नियमों और Cloud Storage के सुरक्षा नियमों के बीच किसी तरह का टकराव नहीं होगा जैसे कि Cloud Firestore जैसे दूसरे प्रॉडक्ट के लिए नियम तय करना.

पढ़ने/लिखने के बुनियादी नियम

बुनियादी नियमों में, Cloud Storage की पहचान करने वाला match स्टेटमेंट शामिल होता है बकेट, फ़ाइल के नाम के बारे में बताने वाला मैच स्टेटमेंट, और allow एक्सप्रेशन दिए गए डेटा को पढ़ते समय जानकारी देने की अनुमति है. allow एक्सप्रेशन इसमें ऐक्सेस के तरीके (जैसे कि पढ़ना, लिखना) और शर्तें बताना के तहत ऐक्सेस दिया जा सकता है या नहीं.

आपके डिफ़ॉल्ट नियमसेट में, पहले match स्टेटमेंट में {bucket} वाइल्डकार्ड का इस्तेमाल किया जाता है एक्सप्रेशन का इस्तेमाल करें. इससे यह पता चलेगा कि नियम आपके प्रोजेक्ट की सभी बकेट पर लागू होते हैं. हम अगले सेक्शन में वाइल्डकार्ड से मेल खाने वाले कॉन्टेंट के आइडिया के बारे में चर्चा करें.

service firebase.storage {
  // The {bucket} wildcard indicates we match files in all Cloud Storage buckets
  match /b/{bucket}/o {
    // Match filename
    match /filename {
      allow read: if <condition>;
      allow write: if <condition>;
    }
  }
}

सभी मैच स्टेटमेंट, फ़ाइलों पर ले जाते हैं. मैच स्टेटमेंट से उपयोगकर्ता को फ़ाइल में दिया गया है, जैसा कि match /images/profilePhoto.png में है.

वाइल्डकार्ड का मिलान करें

किसी एक फ़ाइल पर ले जाने के अलावा, नियम वाइल्डकार्ड का इस्तेमाल भी कर सकते हैं ऐसी फ़ाइल पर ले जाने के लिए जिसके नाम में स्लैश, स्ट्रिंग प्रीफ़िक्स, जैसा कि match /images/{imageId} में है.

ऊपर दिए गए उदाहरण में, मैच स्टेटमेंट में {imageId} वाइल्डकार्ड सिंटैक्स का इस्तेमाल किया गया है. इसका मतलब है कि यह नियम उन सभी फ़ाइलों पर लागू होगा जिनके नाम के शुरू में /images/, जैसे कि /images/profilePhoto.png या /images/croppedProfilePhoto.png. जब मिलान स्टेटमेंट के allow एक्सप्रेशन का आकलन किया जाता है, यानी imageId वैरिएबल इमेज फ़ाइल नाम, जैसे profilePhoto.png या croppedProfilePhoto.png.

फ़ाइल उपलब्ध कराने के लिए, match में वाइल्डकार्ड वैरिएबल का रेफ़रंस दिया जा सकता है नाम या पाथ की अनुमति:

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

हैरारकी के हिसाब से डेटा

जैसा कि हमने पहले कहा था, Cloud Storage बकेट. लेकिन फ़ाइल नामकरण कन्वेंशन का इस्तेमाल करके, अक्सर एक जिसमें फ़ाइल नामों में स्लैश शामिल होते हैं, हम एक ऐसी स्ट्रक्चर की नकल कर सकते हैं जो डायरेक्ट्री और सब-डायरेक्ट्री की नेस्ट की गई सीरीज़. यह समझना ज़रूरी है कि कैसे Firebase के सुरक्षा नियम इन फ़ाइल नामों के साथ इंटरैक्ट करते हैं.

ऐसी फ़ाइलों के सेट की स्थिति पर ध्यान दें जिनके नाम, /images/ स्टेम. Firebase के सुरक्षा नियम, मैच होने वाले फ़ाइल नाम पर ही लागू होते हैं. इसलिए, /images/ स्टेम पर तय किए गए कंट्रोल, /mp3s/ स्टेम पर लागू नहीं होते. इसके बजाय, साफ़ तौर पर ऐसे नियम लिखें जो अलग-अलग फ़ाइल नाम के पैटर्न से मेल खाते हों:

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      allow read, write: if <condition>;
    }

    // Explicitly define rules for the 'mp3s' pattern
    match /mp3s/{mp3Id} {
      allow read, write: if <condition>;
    }
  }
}

match स्टेटमेंट को नेस्ट करने पर, इनर match स्टेटमेंट का पाथ यह होता है हमेशा बाहरी match कथन के पथ में जोड़ा जाता है. नीचे दिए गए दो नियमसेट इसलिए समान हैं:

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Exact match for "images/profilePhoto.png"
      match /profilePhoto.png {
        allow write: if <condition>;
      }
    }
  }
}
service firebase.storage {
  match /b/{bucket}/o {
    // Exact match for "images/profilePhoto.png"
    match /images/profilePhoto.png {
      allow write: if <condition>;
      }
  }
}

बार-बार होने वाले मैच वाइल्डकार्ड

किसी फ़ाइल नाम के आखिर में स्ट्रिंग से मेल खाने वाले और नतीजे देने वाले वाइल्डकार्ड के अलावा, एक से ज़्यादा सेगमेंट वाइल्डकार्ड का इस्तेमाल करके, ज़्यादा मुश्किल मिलान के लिए वाइल्डकार्ड नाम में =** जोड़ना, जैसे कि {path=**}:

// Partial match for files that start with "images"
match /images {

  // 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.

Cloud Storage के सुरक्षा नियम लागू नहीं होते. साथ ही, नियमों का आकलन सिर्फ़ तब किया जाता है, जब अनुरोध पथ बताए गए नियमों वाले पथ से मेल खाता है.

वर्शन 1

Firebase के सुरक्षा नियम डिफ़ॉल्ट रूप से वर्शन 1 का इस्तेमाल करते हैं. वर्शन 1 में, बार-बार होने वाले वाइल्डकार्ड एक या ज़्यादा फ़ाइल नाम के एलिमेंट का मिलान करें, न कि शून्य या ज़्यादा एलिमेंट. इसलिए, match /images/{filenamePrefixWildcard}/{imageFilename=**} किसी फ़ाइल नाम से मेल खाता है जैसे कि /images/profilePics/profile.png, लेकिन /images/badge.png नहीं. इस्तेमाल की जाने वाली चीज़ें अगर आपके पास इन फ़ॉर्मैट की फ़ाइल नहीं है, तो /images/{imagePrefixorFilename=**} बटन का इस्तेमाल करें.

बार-बार इस्तेमाल होने वाले वाइल्डकार्ड, मैच स्टेटमेंट के आखिर में आने चाहिए.

हमारा सुझाव है कि ज़्यादा बेहतर सुविधाओं के लिए, आप वर्शन 2 का इस्तेमाल करें.

वर्शन 2

Firebase के सुरक्षा नियमों के वर्शन 2 में, बार-बार होने वाले वाइल्डकार्ड, शून्य या उससे ज़्यादा पाथ से मेल खाते हैं आइटम. इस तरह, /images/{filenamePrefixWildcard}/{imageFilename=**} मिलान हुए filenames /images/profilePics/profile.png और /images/badge.png.

इसके लिए, आपको सबसे ऊपर rules_version = '2'; को जोड़कर, वर्शन 2 में ऑप्ट-इन करना होगा आपके सुरक्षा नियम:

rules_version = '2';
service cloud.storage {
  match /b/{bucket}/o {
   ...
 }
}

आपके पास हर मैच स्टेटमेंट के लिए, बार-बार लागू होने वाला ज़्यादा से ज़्यादा एक वाइल्डकार्ड हो सकता है, लेकिन वर्शन 2 में, इस वाइल्डकार्ड को मैच स्टेटमेंट में कहीं भी रखा जा सकता है. इसके लिए उदाहरण:

rules_version = '2';
service firebase.storage {
 match /b/{bucket}/o {
   // Matches any file in a songs "subdirectory" under the
   // top level of your Cloud Storage bucket.
   match /{prefixSegment=**}/songs/{mp3filenames} {
     allow read, write: if <condition>;
   }
  }
}

विस्तृत कार्रवाइयां

कुछ स्थितियों में, read और write को अलग-अलग सेगमेंट में बांटना फ़ायदेमंद होता है विस्तृत प्रक्रिया. उदाहरण के लिए, हो सकता है कि आपका ऐप्लिकेशन फ़ाइल हटाने की तुलना में फ़ाइल बनाने में लगने वाली शर्तें.

read ऑपरेशन को get और list में बांटा जा सकता है.

write नियम इन्हें create, update, और delete में बांटा गया है:

service firebase.storage {
  match /b/{bucket}/o {
    // A read rule can be divided into read and list rules
    match /images/{imageId} {
      // Applies to single file read requests
      allow get: if <condition>;
      // Applies to list and listAll requests (Rules Version 2)
      allow list: if <condition>;

    // A write rule can be divided into create, update, and delete rules
    match /images/{imageId} {
      // Applies to writes to file contents
      allow create: if <condition>;

      // Applies to updates to (pre-existing) file metadata
      allow update: if <condition>;

      // Applies to delete operations
      allow delete: if <condition>;
    }
  }
 }
}

ओवरलैप होने वाले मैच स्टेटमेंट

किसी फ़ाइल नाम का एक से ज़्यादा match स्टेटमेंट से मिलान करना संभव है. इस वह मामला जहां कई allow एक्सप्रेशन किसी अनुरोध से मेल खाते हैं, तो ऐक्सेस की अनुमति है अगर कोई शर्त true है:

service firebase.storage {
  match b/{bucket}/o {
    // Matches file names directly inside of '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches file names anywhere under `/images/`
    match /images/{imageId=**} {
      allow read, write: if true;
    }
  }
}

ऊपर दिए गए उदाहरण में, सभी लोग उन फ़ाइलों को पढ़ते और लिखते हैं जिनका नाम इससे शुरू होता है /images/ की अनुमति है, क्योंकि दूसरा नियम हमेशा true होता है, भले ही पहला नियम false है.

नियम, फ़िल्टर नहीं हैं

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

उदाहरण के लिए, सुरक्षा के इस नियम को अपनाएं:

service firebase.storage {
  match /b/{bucket}/o {
    // Allow the client to read files with contentType 'image/png'
    match /aFileNamePrefix/{aFileName} {
      allow read: if resource.contentType == 'image/png';
    }
  }
}

अस्वीकार किया गया: इस नियम के तहत, इन शर्तों को अस्वीकार किया जाता है: अनुरोध नहीं किया जा सकता, क्योंकि नतीजे सेट में वे फ़ाइलें भी शामिल हो सकती हैं जिनमें contentType मौजूद है image/png नहीं:

वेब
filesRef = storage.ref().child("aFilenamePrefix");

filesRef.listAll()
    .then(function(result) {
      console.log("Success: ", result.items);
    })
});

Cloud Storage के सुरक्षा नियमों के नियम, हर क्वेरी का आकलन उसकी क्षमता के आधार पर करते हैं के नतीजे का पता चलता है और अगर क्लाइंट की ओर से की गई फ़ाइल को वापस कर देता है, तो वह अनुरोध नहीं कर पाता है को पढ़ने की अनुमति नहीं है. ऐक्सेस के अनुरोध, आपके नियम.

अगले चरण

Cloud Storage के लिए Firebase के सुरक्षा नियमों को बेहतर तरीके से समझा जा सकता है:

  • 'नियम' की भाषा का अगला मुख्य कॉन्सेप्ट डाइनैमिक तरीके से सीखें शर्तें पूरी करता है, जिनसे आपके नियमों को उपयोगकर्ता की अनुमति की जांच करने का मौका मिलता है, इसमें मौजूदा और इनकमिंग डेटा की तुलना करने, आने वाले डेटा की पुष्टि करने वगैरह की सुविधाएं मिलती हैं.

  • सुरक्षा के सामान्य इस्तेमाल के उदाहरणों की समीक्षा करें और Firebase के सुरक्षा नियमों की परिभाषाएं, जो उन्हें हल करती हैं.

Firebase के सुरक्षा नियमों में, Cloud Storage के लिए खास तौर पर इस्तेमाल किए जाने वाले उदाहरणों के बारे में जाना जा सकता है: