নিরাপত্তা নিয়ম কিভাবে কাজ করে

অ্যাপ ডেভেলপমেন্ট ধাঁধার সবচেয়ে জটিল অংশগুলির মধ্যে একটি হতে পারে নিরাপত্তা। বেশিরভাগ অ্যাপ্লিকেশনে, ডেভেলপারদের এমন একটি সার্ভার তৈরি এবং চালাতে হয় যা প্রমাণীকরণ (একজন ব্যবহারকারী কে) এবং অনুমোদন (একজন ব্যবহারকারী কী করতে পারে) পরিচালনা করে।

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 , এবং deleteread এবং write সুবিধার্থে পদ্ধতিগুলি নির্দিষ্ট ডাটাবেস বা স্টোরেজ পাথে বিস্তৃত পঠন এবং লেখার অ্যাক্সেস সক্ষম করে।
  • পথ: ডাটাবেস বা স্টোরেজ অবস্থান, যা একটি URI পথ হিসাবে উপস্থাপিত হয়।
  • নিয়ম: allow স্টেটমেন্ট, যার মধ্যে এমন একটি শর্ত থাকে যা একটি অনুরোধকে সত্য হিসাবে মূল্যায়ন করলে অনুমতি দেয়।

নিরাপত্তা নিয়ম সংস্করণ ২

মে ২০১৯ থেকে, Firebase নিরাপত্তা নিয়মের সংস্করণ ২ এখন উপলব্ধ। নিয়মের সংস্করণ ২ পুনরাবৃত্ত ওয়াইল্ডকার্ড {name=**} এর আচরণ পরিবর্তন করে। যদি আপনি সংগ্রহ গ্রুপ কোয়েরি ব্যবহার করার পরিকল্পনা করেন তবে আপনাকে অবশ্যই সংস্করণ ২ ব্যবহার করতে হবে। আপনার নিরাপত্তা নিয়মের প্রথম লাইনটি 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>;
    }
  }
}

ওভারল্যাপিং ম্যাচ স্টেটমেন্ট

একটি ডকুমেন্টের একাধিক 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.
    match /cities/{document} {
      allow read, write: if true;
    }
  }
}

উদাহরণে, cities সংগ্রহে সমস্ত পঠন এবং লেখার অনুমতি দেওয়া হবে কারণ দ্বিতীয় নিয়মটি সর্বদা true , যদিও প্রথম নিয়মটি সর্বদা false

পুনরাবৃত্ত ওয়াইল্ডকার্ড

যদি আপনি চান যে নিয়মগুলি একটি ইচ্ছামত গভীর অনুক্রমের ক্ষেত্রে প্রয়োগ করা হোক, তাহলে রিকার্সিভ ওয়াইল্ডকার্ড সিনট্যাক্স ব্যবহার করুন, {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

তবে মনে রাখবেন, রিকার্সিভ ওয়াইল্ডকার্ডের আচরণ নিয়ম সংস্করণের উপর নির্ভর করে।

সংস্করণ ১

নিরাপত্তা নিয়মগুলি ডিফল্টরূপে সংস্করণ ১ ব্যবহার করে। সংস্করণ ১-এ, পুনরাবৃত্ত ওয়াইল্ডকার্ডগুলি এক বা একাধিক পাথ আইটেমের সাথে মেলে। এগুলি একটি খালি পাথের সাথে মেলে না, তাই match /cities/{city}/{document=**} উপ-সংগ্রহের নথির সাথে মেলে কিন্তু cities সংগ্রহের সাথে নয়, যেখানে match /cities/{document=**} cities সংগ্রহ এবং উপ-সংগ্রহের উভয় নথির সাথে মেলে।

পুনরাবৃত্ত ওয়াইল্ডকার্ড অবশ্যই ম্যাচ স্টেটমেন্টের শেষে আসতে হবে।

সংস্করণ ২

নিরাপত্তা নিয়মের সংস্করণ ২-এ, পুনরাবৃত্ত ওয়াইল্ডকার্ডগুলি শূন্য বা তার বেশি পাথ আইটেমের সাথে মেলে। 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>;
    }
  }
}

প্রতিটি ম্যাচ স্টেটমেন্টে আপনার সর্বাধিক একটি রিকার্সিভ ওয়াইল্ডকার্ড থাকতে পারে, কিন্তু ভার্সন ২-এ, আপনি ম্যাচ স্টেটমেন্টের যেকোনো জায়গায় এই ওয়াইল্ডকার্ডটি রাখতে পারেন। উদাহরণস্বরূপ:

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 ব্যবহার করতে হবে, সংগ্রহ গোষ্ঠীর প্রশ্নগুলি সুরক্ষিত করা দেখুন।

নিরাপত্তা নিয়মের সীমা

নিরাপত্তা নিয়ম নিয়ে কাজ করার সময়, নিম্নলিখিত সীমাগুলি লক্ষ্য করুন:

সীমা বিস্তারিত
প্রতি অনুরোধে সর্বোচ্চ সংখ্যক exists() , get() এবং getAfter() কল
  • একক-নথি অনুরোধ এবং কোয়েরি অনুরোধের জন্য ১০।
  • মাল্টি-ডকুমেন্ট রিড, লেনদেন এবং ব্যাচড রাইটসের জন্য ২০। পূর্ববর্তী ১০ এর সীমা প্রতিটি অপারেশনের ক্ষেত্রেও প্রযোজ্য।

    উদাহরণস্বরূপ, কল্পনা করুন আপনি 3টি লেখার অপারেশন সহ একটি ব্যাচড লেখার অনুরোধ তৈরি করেছেন এবং আপনার সুরক্ষা নিয়ম প্রতিটি লেখা যাচাই করার জন্য 2টি ডকুমেন্ট অ্যাক্সেস কল ব্যবহার করে। এই ক্ষেত্রে, প্রতিটি লেখা তার 10টি অ্যাক্সেস কলের মধ্যে 2টি ব্যবহার করে এবং ব্যাচড লেখার অনুরোধ তার 20টি অ্যাক্সেস কলের মধ্যে 6টি ব্যবহার করে।

যেকোনো সীমা অতিক্রম করলে অনুমতি অস্বীকারের ত্রুটি দেখা দেয়।

কিছু ডকুমেন্ট অ্যাক্সেস কল ক্যাশে করা হতে পারে এবং ক্যাশে করা কলগুলি সীমার মধ্যে গণনা করা হয় না।

সর্বাধিক নেস্টেড match স্টেটমেন্ট গভীরতা ১০
নেস্টেড match স্টেটমেন্টের একটি সেটের মধ্যে অনুমোদিত পাথ সেগমেন্টে সর্বোচ্চ পাথ দৈর্ঘ্য ১০০
নেস্টেড match স্টেটমেন্টের একটি সেটের মধ্যে অনুমোদিত সর্বাধিক সংখ্যক পাথ ক্যাপচার ভেরিয়েবল ২০
সর্বাধিক ফাংশন কল গভীরতা ২০
ফাংশন আর্গুমেন্টের সর্বাধিক সংখ্যা
প্রতি ফাংশনে let ভেরিয়েবল বাইন্ডিংয়ের সর্বোচ্চ সংখ্যা ১০
রিকার্সিভ বা সাইক্লিকাল ফাংশন কলের সর্বাধিক সংখ্যা ০ (অনুমোদিত নয়)
প্রতি অনুরোধে মূল্যায়ন করা সর্বোচ্চ সংখ্যক এক্সপ্রেশন ১,০০০
একটি নিয়ম সেটের সর্বোচ্চ আকার নিয়ম সেটগুলিকে দুটি আকারের সীমা মেনে চলতে হবে:
  • Firebase কনসোল থেকে অথবা firebase deploy ব্যবহার করে CLI থেকে প্রকাশিত রুলসেট টেক্সট সোর্সের আকারের উপর 256 KB সীমা।
  • Firebase যখন সোর্সটি প্রক্রিয়া করে এবং ব্যাক-এন্ডে এটি সক্রিয় করে তখন কম্পাইল করা রুলসেটের আকারের উপর 250 KB সীমা নির্ধারণ করা হয়।

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 , এবং deleteread এবং write সুবিধার্থে পদ্ধতিগুলি নির্দিষ্ট ডাটাবেস বা স্টোরেজ পাথে বিস্তৃত পঠন এবং লেখার অ্যাক্সেস সক্ষম করে।
  • পথ: ডাটাবেস বা স্টোরেজ অবস্থান, যা একটি URI পথ হিসাবে উপস্থাপিত হয়।
  • নিয়ম: allow স্টেটমেন্ট, যার মধ্যে এমন একটি শর্ত থাকে যা একটি অনুরোধকে সত্য হিসাবে মূল্যায়ন করলে অনুমতি দেয়।

মিলে যাওয়া পথ

Cloud Storage Security Rules Cloud Storage ফাইল অ্যাক্সেস করার জন্য ব্যবহৃত ফাইল পাথের 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";
}

Cloud Storage Security Rules ক্যাসকেড হয় না, এবং রুলসগুলি কেবল তখনই মূল্যায়ন করা হয় যখন অনুরোধের পথটি নির্দিষ্ট নিয়ম সহ একটি রুলসের সাথে মেলে।

মূল্যায়নের অনুরোধ করুন

Cloud Storage প্রেরিত request ব্যবহার করে আপলোড, ডাউনলোড, মেটাডেটা পরিবর্তন এবং মুছে ফেলার মূল্যায়ন করা হয়। request ভেরিয়েবলে অনুরোধটি কোথায় সম্পাদিত হচ্ছে তার পথ, অনুরোধটি কখন প্রাপ্ত হয়েছে তা এবং অনুরোধটি লেখা হলে নতুন resource মান অন্তর্ভুক্ত থাকে। HTTP হেডার এবং প্রমাণীকরণ অবস্থাও অন্তর্ভুক্ত থাকে।

request অবজেক্টে ব্যবহারকারীর অনন্য আইডি এবং request.auth অবজেক্টে Firebase Authentication পেলোডও থাকে, যা ডক্সের Authentication বিভাগে আরও ব্যাখ্যা করা হবে।

request বস্তুর বৈশিষ্ট্যের একটি সম্পূর্ণ তালিকা নীচে পাওয়া যাবে:

সম্পত্তি আদর্শ বিবরণ
auth মানচিত্র<স্ট্রিং, স্ট্রিং> যখন একজন ব্যবহারকারী লগ ইন করেন, তখন uid , ব্যবহারকারীর অনন্য আইডি এবং token , Firebase Authentication JWT দাবির একটি মানচিত্র প্রদান করেন। অন্যথায়, এটি null হবে।
params মানচিত্র<স্ট্রিং, স্ট্রিং> অনুরোধের কোয়েরি প্যারামিটার সম্বলিত মানচিত্র।
path পথ অনুরোধটি যে পথে সম্পাদিত হচ্ছে তার প্রতিনিধিত্বকারী একটি path
resource মানচিত্র<স্ট্রিং, স্ট্রিং> নতুন রিসোর্স মান, শুধুমাত্র write অনুরোধে উপস্থিত।
time টাইমস্ট্যাম্প একটি টাইমস্ট্যাম্প যা সার্ভারের অনুরোধটি মূল্যায়নের সময়কে প্রতিনিধিত্ব করে।

সম্পদ মূল্যায়ন

নিয়ম মূল্যায়ন করার সময়, আপনি আপলোড, ডাউনলোড, পরিবর্তন বা মুছে ফেলা ফাইলের মেটাডেটাও মূল্যায়ন করতে চাইতে পারেন। এটি আপনাকে জটিল এবং শক্তিশালী নিয়ম তৈরি করতে দেয় যা কেবলমাত্র নির্দিষ্ট ধরণের সামগ্রী সহ ফাইল আপলোড করার অনুমতি দেয়, অথবা শুধুমাত্র একটি নির্দিষ্ট আকারের চেয়ে বড় ফাইল মুছে ফেলার অনুমতি দেয়।

Cloud Storage জন্য Firebase Security Rules resource অবজেক্টে ফাইল মেটাডেটা প্রদান করে, যার মধ্যে Cloud Storage অবজেক্টে উপস্থিত মেটাডেটার কী/মান জোড়া থাকে। ডেটা অখণ্ডতা নিশ্চিত করার জন্য এই বৈশিষ্ট্যগুলি read বা write অনুরোধে পরিদর্শন করা যেতে পারে।

write অনুরোধে (যেমন আপলোড, মেটাডেটা আপডেট এবং ডিলিট) resource অবজেক্ট ছাড়াও, যেখানে রিকোয়েস্ট পাথে থাকা ফাইলের জন্য ফাইল মেটাডেটা থাকে, আপনার কাছে request.resource অবজেক্টটি ব্যবহার করার ক্ষমতাও রয়েছে, যেখানে লেখার অনুমতি থাকলে লেখার জন্য ফাইল মেটাডেটার একটি উপসেট থাকে। আপনি ডেটা অখণ্ডতা নিশ্চিত করতে বা ফাইলের ধরণ বা আকারের মতো অ্যাপ্লিকেশন সীমাবদ্ধতা প্রয়োগ করতে এই দুটি মান ব্যবহার করতে পারেন।

resource অবজেক্টের বৈশিষ্ট্যের একটি সম্পূর্ণ তালিকা উপলব্ধ:

সম্পত্তি আদর্শ বিবরণ
name স্ট্রিং বস্তুর পুরো নাম
bucket স্ট্রিং এই বস্তুটি যে বালতিতে থাকে তার নাম।
generation int-এর বিবরণ এই অবজেক্টের Google Cloud Storage অবজেক্ট জেনারেশন
metageneration int-এর বিবরণ এই অবজেক্টের Google Cloud Storage অবজেক্ট মেটা জেনারেশন
size int-এর বিবরণ বাইটে বস্তুর আকার।
timeCreated টাইমস্ট্যাম্প একটি টাইমস্ট্যাম্প যা একটি বস্তু তৈরির সময়কে প্রতিনিধিত্ব করে।
updated টাইমস্ট্যাম্প একটি টাইমস্ট্যাম্প যা একটি অবজেক্টের সর্বশেষ আপডেটের সময়কে প্রতিনিধিত্ব করে।
md5Hash স্ট্রিং বস্তুর একটি MD5 হ্যাশ।
crc32c স্ট্রিং বস্তুর একটি crc32c হ্যাশ।
etag স্ট্রিং এই বস্তুর সাথে সম্পর্কিত 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 {
     // 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) Filename (stored in imageId wildcard variable) is less than 32 characters
     match /{imageId} {
       allow read;
       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 একটি 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 ফিরে আসবে না। তবে, আসল ফলাফল হল একটি ত্রুটি:

জাভাস্ক্রিপ্ট
var db = firebase.database();
db.ref("records").once("value", function(snap) {
  // success method is not called
}, function(err) {
  // error callback triggered with PERMISSION_DENIED
});
অবজেক্টিভ-সি
দ্রষ্টব্য: এই Firebase পণ্যটি অ্যাপ ক্লিপ টার্গেটে উপলব্ধ নয়।
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
}];
সুইফট
দ্রষ্টব্য: এই Firebase পণ্যটি অ্যাপ ক্লিপ টার্গেটে উপলব্ধ নয়।
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 ত্রুটি তৈরি করবে। যদি আমরা আমাদের Firebase কনসোলের সিকিউরিটি সিমুলেটরে এই নিয়মটি মূল্যায়ন করি, তাহলে আমরা দেখতে পাব যে রিড অপারেশনটি অস্বীকার করা হয়েছে:

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
});
অবজেক্টিভ-সি
দ্রষ্টব্য: এই Firebase পণ্যটি অ্যাপ ক্লিপ টার্গেটে উপলব্ধ নয়।
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[ref child:@"records/rec1"] observeSingleEventOfType:FEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
    // SUCCESS!
}];
সুইফট
দ্রষ্টব্য: এই Firebase পণ্যটি অ্যাপ ক্লিপ টার্গেটে উপলব্ধ নয়।
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!

অবস্থান পরিবর্তনশীল

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