Cloud Firestore Security Rules আপনাকে ডেটাবেসে ডকুমেন্ট ও কালেকশন অ্যাক্সেস করার সুবিধা নিয়ন্ত্রণ করতে দেয়। ফ্লেক্সিবল রুল সিনট্যাক্স আপনাকে এমন নিয়ম তৈরি করতে দেয় যা সম্পূর্ণ ডেটাবেসে লেখা থেকে শুরু করে নির্দিষ্ট ডকুমেন্টে অপারেশন পর্যন্ত যেকোনও কিছুর সাথে মেলে।
এই নির্দেশিকা নিরাপত্তা নিয়মের প্রাথমিক সিনট্যাক্স ও গঠন বর্ণনা করে। সম্পূর্ণ রুলসেট তৈরি করতে নিরাপত্তা সংক্রান্ত নিয়মের শর্ত-এর সাথে এই সিনট্যাক্স একত্রিত করুন।
AI অ্যাসিস্ট্যান্সের জন্য AI প্রম্পট
AI-এর মাধ্যমে সহায়তা পেতে, নিচের প্রম্পটটি আপনার AI কোডিং এজেন্টে (যেমন, Android Studio-তে Gemini, Antigravity, Claude Code, Codex এবং Cursor) কপি করুন। আপনি প্রম্পট কাস্টমাইজ করতে এবং আপনার এজেন্টের সাথে আইটারেট করতে পারবেন। ইনস্টলেশন সংক্রান্ত বিস্তারিত তথ্যের জন্য Firebase এজেন্ট সংক্রান্ত দক্ষতা দেখুন।
Help me use Firebase in my app.
1. Make sure that **Firebase agent skills** are installed and updated. For Claude Code, Codex, or Cursor agents, help me install the Firebase plugin. For other agents, run `npx skills add firebase/agent-skills`. Always try to use **Firebase agent skills** for Firebase-related tasks.
2. Help me write, validate, and deploy Firebase Security Rules to protect my app's Firestore data.
পরিষেবা ও ডেটাবেস ঘোষণা
Cloud Firestore Security Rules সবসময় নিম্নলিখিত ঘোষণা দিয়ে শুরু হয়:
service cloud.firestore {
// The {database} wildcard allows the rules to reference any database,
// but these rules are only active on databases where they are explicitly deployed.
match /databases/{database}/documents {
// ...
}
}service cloud.firestore ডিক্লারেশন, নিয়মগুলিকে
নিয়মে স্কোপ করে, যা Cloud Firestore Security Rules এবং
Cloud Storage-এর মতো অন্যান্য প্রোডাক্টের নিয়মের মধ্যে বিরোধ প্রতিরোধ করে।
match /databases/{database}/documents ঘোষণা নির্দিষ্ট করে যে নিয়মগুলি
প্রজেক্টের যেকোনও নিয়ম ডেটাবেসের সাথে মিলতে হবে। একটি প্রোজেক্টে
সর্বাধিক ১০০টি ডেটাবেস থাকতে পারে, তবে শুধুমাত্র প্রথম তৈরি করা ডেটাবেসটি ডিফল্ট হিসেবে
নির্ধারিত হয়।
আপনার প্রোজেক্টের প্রতিটি নামযুক্ত ডেটাবেসের জন্য আলাদাভাবে Cloud Firestore Security Rules প্রয়োগ করা হয়। এর অর্থ হল, আপনি একাধিক ডেটাবেস তৈরি করলে, আপনাকে প্রতিটি ডেটাবেসের জন্য আলাদাভাবে নিয়ম ম্যানেজ ও প্রয়োগ করতে হবে। আপনার আপডেট ডিপ্লয় করার ব্যাপারে বিস্তারিত নির্দেশাবলীর জন্য, আপনার আপডেট ডিপ্লয় করুন দেখুন।
প্রাথমিক রিড/রাইট সংক্রান্ত নিয়ম
প্রাথমিক নিয়মে একটি match স্টেটমেন্ট থাকে যা ডকুমেন্টের পাথ নির্দিষ্ট করে এবং
একটি allow এক্সপ্রেশন থাকে যা নির্দিষ্ট ডেটা কখন পড়া যাবে তা বিস্তারিতভাবে জানায়:
service cloud.firestore { match /databases/{database}/documents { // Match any document in the 'cities' collection match /cities/{city} { allow read: if <condition>; allow write: if <condition>; } } }
সব ম্যাচ স্টেটমেন্ট ডকুমেন্টকে নির্দেশ করবে, কালেকশনকে নয়। একটি match
স্টেটমেন্ট নির্দিষ্ট ডকুমেন্টকে পয়েন্ট করতে পারে, যেমন match /cities/SF-এ অথবা ওয়াইল্ডকার্ড ব্যবহার করে
নির্দিষ্ট পাথে যেকোনও ডকুমেন্টকে পয়েন্ট করতে পারে, যেমন match /cities/{city}-এ।
উপরের উদাহরণে, ম্যাচ স্টেটমেন্ট {city} ওয়াইল্ডকার্ড সিনট্যাক্স ব্যবহার করে।
এর অর্থ হল, cities সংগ্রহে থাকা যেকোনও ডকুমেন্টের ক্ষেত্রে এই নিয়ম প্রযোজ্য, যেমন
/cities/SF বা /cities/NYC। ম্যাচ স্টেটমেন্টে allow এক্সপ্রেশন
মূল্যায়ন করা হলে, city ভেরিয়েবলটি শহরের ডকুমেন্ট নাম হিসেবে সমাধান করা হবে,
যেমন SF বা NYC।
গ্র্যানুলার অপারেশন
কিছু পরিস্থিতিতে, read এবং write-কে আরও
গ্র্যানুলার অপারেশনে ভাগ করা উপযোগী। যেমন, আপনার অ্যাপ ডকুমেন্ট মুছে ফেলার চেয়ে ডকুমেন্ট তৈরি করার ক্ষেত্রে
অন্য শর্ত প্রয়োগ করতে চাইতে পারে। অথবা আপনি হয়ত
একটি ডকুমেন্ট পড়ার অনুমতি দিতে চান কিন্তু বড় কোয়েরি বাতিল করতে চান।
read নিয়মকে get ও list-এ ভাগ করা যেতে পারে, যেখানে write নিয়মকে
create, update ও delete-এ ভাগ করা যেতে পারে:
service cloud.firestore { match /databases/{database}/documents { // A read rule can be divided into get and list rules match /cities/{city} { // Applies to single document read requests allow get: if <condition>; // Applies to queries and collection read requests allow list: if <condition>; } // A write rule can be divided into create, update, and delete rules match /cities/{city} { // Applies to writes to nonexistent documents allow create: if <condition>; // Applies to writes to existing documents allow update: if <condition>; // Applies to delete operations allow delete: if <condition>; } } }
হায়ারার্কিক্যাল ডেটা
Rules-এ ডেটা ডকুমেন্টের সংগ্রহে সাজানো থাকে এবং প্রতিটি ডকুমেন্ট সাব-কালেকশনের মাধ্যমে হায়ারার্কি বাড়াতে পারে। নিরাপত্তা সংক্রান্ত নিয়ম কীভাবে হায়ারার্কিক্যাল ডেটার সাথে ইন্টার্যাক্ট করে তা বোঝা গুরুত্বপূর্ণ।
এমন পরিস্থিতি বিবেচনা করুন যেখানে 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।
তবে মনে রাখবেন, রিকার্সিভ ওয়াইল্ডকার্ডের আচরণ নিয়মের ভার্সনের উপর নির্ভর করে।
ভার্সন ১
নিরাপত্তা সংক্রান্ত নিয়ম ডিফল্ট হিসেবে ভার্সন ১ ব্যবহার করে। ভার্সন ১-এ, রিকার্সিভ ওয়াইল্ডকার্ড
এক বা একাধিক পাথ আইটেমের সাথে ম্যাচ করে। এগুলি খালি পাথের সাথে মেলে না, তাই
match /cities/{city}/{document=**} সাবকালেকশনে থাকা ডকুমেন্টের সাথে মেলে কিন্তু
cities কালেকশনে থাকা ডকুমেন্টের সাথে মেলে না, যেখানে match /cities/{document=**}
cities কালেকশন ও সাবকালেকশন, দুটিতেই থাকা ডকুমেন্টের সাথে মেলে।
ম্যাচ স্টেটমেন্টের শেষে রিকার্সিভ ওয়াইল্ডকার্ড থাকতে হবে।
ভার্সন 2
নিরাপত্তা নিয়মের ২ ভার্সনে, রিকার্সিভ ওয়াইল্ডকার্ড শূন্য বা তার বেশি পাথ আইটেমের সাথে
ম্যাচ করে। match/cities/{city}/{document=**} যেকোনও সাবকালেকশনের ডকুমেন্টের সাথে সাথে
cities কালেকশনের ডকুমেন্টের সাথেও ম্যাচ করে।
আপনার নিরাপত্তা নিয়মের একদম উপরে rules_version = '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>; } } }
আপনি কালেকশন গ্রুপ কোয়েরি ব্যবহার করলে, আপনাকে অবশ্যই ভার্সন ২ ব্যবহার করতে হবে, কালেকশন গ্রুপ কোয়েরি সুরক্ষিত করা দেখুন।
ওভারল্যাপ করা ম্যাচ স্টেটমেন্ট
কোনও ডকুমেন্ট একাধিক 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 স্টেটমেন্টের সেটের মধ্যে অনুমোদিত পাথ সেগমেন্টে
পাথের সর্বাধিক দৈর্ঘ্য |
১০০ |
নেস্টেড match স্টেটমেন্টের সেটের মধ্যে সর্বাধিক যতগুলি পাথ ক্যাপচার ভেরিয়েবল
অনুমোদিত |
20 |
| ফাংশন কলের সর্বাধিক গভীরতা | 20 |
| ফাংশন আর্গুমেন্টের সর্বাধিক সংখ্যা | 7 |
ফাংশন প্রতি সর্বাধিক letটি ভেরিয়েবল বাইন্ডিং |
10 |
| রিকার্সিভ বা সাইক্লিক্যাল ফাংশন কলের সর্বাধিক সংখ্যা | ০ (অনুমতি নেই) |
| প্রতিটি অনুরোধে সর্বাধিক যতগুলি এক্সপ্রেশন মূল্যায়ন করা হয়েছে | ১,০০০ |
| রুলসেটের সর্বাধিক সাইজ | রুলসেটকে অবশ্যই দুটি সাইজের সীমা মেনে চলতে হবে:
|