क्लाउड स्टोरेज भाषा के लिए फायरबेस सुरक्षा नियमों के मूल सिंटैक्स को जानें

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

यह मार्गदर्शिका संपूर्ण नियम सेट बनाने के लिए क्लाउड स्टोरेज सुरक्षा नियमों के मूल सिंटैक्स और संरचना का वर्णन करती है।

सेवा और डेटाबेस घोषणा

क्लाउड स्टोरेज के लिए फायरबेस सुरक्षा नियम हमेशा निम्नलिखित घोषणा से शुरू होते हैं:

service firebase.storage {
    // ...
}

service firebase.storage घोषणा Cloud Storage पर नियम scopes, इस तरह के बादल इस firestore के रूप में अन्य उत्पादों के लिए क्लाउड संग्रहण सुरक्षा नियमों और नियमों के बीच संघर्ष को रोकने।

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

बुनियादी नियम एक से मिलकर 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

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

एक एकल फाइल की ओर इशारा करते के लिए additiont में, नियम वाइल्डकार्ड बात करने के लिए किसी भी फाइल को अपने नाम में एक दिया स्ट्रिंग उपसर्ग, स्लैश सहित के साथ उपयोग कर सकते हैं, के रूप में 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";
}

पदानुक्रमित डेटा

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

नाम के साथ फ़ाइलों का सेट की स्थिति यह है कि सभी के साथ शुरू करने पर विचार करें /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 सभी नियमों का मूल्यांकन का परिणाम की। यह है कि, किसी भी नियम है, तो फ़ाइल के लिए evalutes से मेल खाता है true , परिणाम है true

उपरोक्त नियमों में, फ़ाइल "छवियों / profilePhoto.png" यदि या तो पढ़ा जा सकता है condition या other_condition सच का मूल्यांकन है, जबकि फ़ाइल "छवियों / उपयोगकर्ताओं / उपयोगकर्ता: 12345 / profilePhoto.png" का नतीजा करने के लिए केवल विषय है other_condition .

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

संस्करण 1

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

रिकर्सिव वाइल्डकार्ड मैच स्टेटमेंट के अंत में आने चाहिए।

हम अनुशंसा करते हैं कि आप इसकी अधिक शक्तिशाली विशेषताओं के लिए संस्करण 2 का उपयोग करें।

संस्करण 2

फायरबेस सुरक्षा नियमों के संस्करण 2 में, पुनरावर्ती वाइल्डकार्ड शून्य या अधिक पथ आइटम से मेल खाते हैं। इस प्रकार, /images/{filenamePrefixWildcard}/{imageFilename=**} से मेल खाता है /images/profilePics/profile.png और /images/badge.png बदल दें।

आपसे ऑप्ट इन संस्करण 2 करने के लिए करना चाहिए जोड़कर rules_version = '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 document 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 nonexistent files
      allow create: if <condition>;

      // Applies to updates to 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 any filename containing string '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches all filenames containing string `/images/`
    match /images/{imageId=**} {
      allow read, write: if true;
    }
  }
}

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

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

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

उदाहरण के लिए, निम्नलिखित सुरक्षा नियम लें:

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);
    })
});

क्लाउड स्टोरेज सुरक्षा नियमों के नियम प्रत्येक क्वेरी का उसके संभावित परिणाम के विरुद्ध मूल्यांकन करते हैं और अनुरोध को विफल कर देते हैं यदि वह ऐसी फ़ाइल लौटा सकता है जिसे पढ़ने के लिए क्लाइंट के पास अनुमति नहीं है। एक्सेस अनुरोधों को आपके नियमों द्वारा निर्धारित बाधाओं का पालन करना चाहिए।

अगला कदम

आप क्लाउड स्टोरेज के लिए फायरबेस सुरक्षा नियमों की अपनी समझ को गहरा कर सकते हैं:

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

  • ठेठ सुरक्षा उपयोग के मामलों की समीक्षा करें और Firebase सुरक्षा नियम परिभाषाओं है कि उन्हें पता

आप Firebase सुरक्षा नियम क्लाउड स्टोरेज के लिए विशिष्ट मामलों का उपयोग कर सकते हैं: