এই পৃষ্ঠাটি
নিরাপত্তা সংক্রান্ত নিয়ম স্ট্রাকচার করা এবং
নিরাপত্তা সংক্রান্ত নিয়মের জন্য শর্ত লেখা-এর ধারণার উপর ভিত্তি করে তৈরি করা হয়েছে, যাতে ব্যাখ্যা করা যায় যে কীভাবে
Cloud Firestore Security Rules কোয়েরির সাথে ইন্টার্যাক্ট করে। এটি আরও ভালভাবে দেখে যে কীভাবে
নিরাপত্তা সংক্রান্ত নিয়ম আপনার লেখা কোয়েরিকে প্রভাবিত করে এবং কীভাবে আপনার কোয়েরি
নিরাপত্তা সংক্রান্ত নিয়মের মতো একই সীমাবদ্ধতা ব্যবহার করে তা নিশ্চিত করতে হয়। এছাড়াও, এই পৃষ্ঠায়
বর্ণনা করা হয়েছে যে কীভাবে limit ও orderBy-এর মতো কোয়েরি প্রপার্টির উপর ভিত্তি করে কোয়েরি অনুমোদন বা বাতিল করার জন্য
নিরাপত্তা সংক্রান্ত নিয়ম লিখতে হয়।
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.
নিয়ম ফিল্টার নয়
ডকুমেন্ট ফিরিয়ে আনার জন্য কোয়েরি লেখার সময় মনে রাখবেন যে নিরাপত্তা সংক্রান্ত নিয়ম ফিল্টার নয়—কোয়েরি হয় সব অথবা কিছুই নয়। আপনার সময় ও রিসোর্স বাঁচাতে, নিয়মাবলী আপনার সব ডকুমেন্টের আসল ফিল্ড ভ্যালুর পরিবর্তে সম্ভাব্য ফলাফল সেটের সাথে কোয়েরি মূল্যায়ন করে। কোনও কোয়েরি যদি এমন ডকুমেন্ট ফেরত দেয় যা পড়ার অনুমতি ক্লায়েন্টের নেই, তাহলে সম্পূর্ণ অনুরোধটি বাতিল হয়ে যায়।
কোয়েরি ও নিরাপত্তা সংক্রান্ত নিয়ম
নিচের উদাহরণে যেমন দেখানো হয়েছে, আপনার নিরাপত্তা নিয়মের সীমাবদ্ধতার সাথে মানানসই করে কোয়েরি লিখতে হবে।
auth.uid-এর ভিত্তিতে ডকুমেন্ট সুরক্ষিত ও কোয়েরি করুন
নিচের উদাহরণে দেখানো হয়েছে যে কীভাবে নিরাপত্তা সংক্রান্ত নিয়মের মাধ্যমে সুরক্ষিত ডকুমেন্ট
উদ্ধার করার জন্য কোয়েরি লিখতে হয়। এমন একটি ডেটাবেস বিবেচনা করুন যাতে
storyটি ডকুমেন্টের একটি সংগ্রহ রয়েছে:
/stories/{storyid}
{
title: "A Great Story",
content: "Once upon a time...",
author: "some_auth_id",
published: false
}
title এবং content ফিল্ড ছাড়াও, প্রতিটি ডকুমেন্ট অ্যাক্সেস কন্ট্রোলের জন্য ব্যবহার করতে
author এবং published ফিল্ড স্টোর করে। এইসব উদাহরণে ধরে নেওয়া হয়েছে যে
অ্যাপটি Firebase Authentication ব্যবহার করে author ফিল্ডটি
ডকুমেন্ট তৈরি করা ব্যবহারকারীর UID-তে সেট করে। Firebase
Authentication, নিরাপত্তা সংক্রান্ত নিয়মে request.auth ভেরিয়েবলও
পপুলেট করে।
নিম্নলিখিত নিরাপত্তা নিয়ম request.auth এবং
resource.data ভেরিয়েবল ব্যবহার করে প্রতিটি story-এর লেখককে
পড়া ও লেখার অ্যাক্সেস সীমিত করে:
service cloud.firestore {
match /databases/{database}/documents {
match /stories/{storyid} {
// Only the authenticated user who authored the document can read or write
allow read, write: if request.auth != null && request.auth.uid == resource.data.author;
}
}
}
ধরুন, আপনার অ্যাপে এমন একটি পৃষ্ঠা আছে যেখানে ব্যবহারকারীর তৈরি করা story
ডকুমেন্টের তালিকা দেখানো হয়। আপনি হয়ত আশা করবেন যে এই পৃষ্ঠাটি পূরণ করার জন্য আপনি নিম্নলিখিত কোয়েরি ব্যবহার করতে পারবেন। তবে, এই কোয়েরি কাজ করবে না, কারণ এতে আপনার নিরাপত্তা সংক্রান্ত নিয়মের মতো
একই সীমাবদ্ধতা নেই:
ভুল: কোয়েরি কনস্ট্রেন্ট, নিরাপত্তা সংক্রান্ত নিয়মের কনস্ট্রেন্টের সাথে ম্যাচ করে না
// This query will fail
db.collection("stories").get()
বর্তমান ব্যবহারকারী প্রতিটি story ডকুমেন্টের লেখক হলেও কোয়েরি কাজ করে না। এই আচরণের কারণ হল, যখন
Rules আপনার নিরাপত্তা সংক্রান্ত নিয়ম প্রয়োগ করে, তখন এটি আপনার ডেটাবেসে থাকা ডকুমেন্টের আসল প্রপার্টির পরিবর্তে
এর সম্ভাব্য ফলাফল সেটের সাথে কোয়েরি মূল্যায়ন করে। কোনও কোয়েরিতে যদি সম্ভাব্য এমন ডকুমেন্ট থাকে
যা আপনার নিরাপত্তা সংক্রান্ত নিয়ম লঙ্ঘন করে, তাহলে কোয়েরিটি ব্যর্থ হবে।
বিপরীতে, নিম্নলিখিত কোয়েরিটি সফল হয়, কারণ এতে নিরাপত্তা নিয়মের মতো author ফিল্ডে একই সীমাবদ্ধতা অন্তর্ভুক্ত থাকে:
সঠিক: কোয়েরি কনস্ট্রেন্ট নিরাপত্তা নিয়মের কনস্ট্রেন্টের সাথে ম্যাচ করে
var user = firebase.auth().currentUser;
db.collection("stories").where("author", "==", user.uid).get()
কোনও ফিল্ডের ভিত্তিতে ডকুমেন্ট সুরক্ষিত ও কোয়েরি করুন
কোয়েরি ও নিয়মের মধ্যে ইন্টার্যাকশন আরও ভালভাবে বোঝাতে, নিচের নিরাপত্তা সংক্রান্ত নিয়ম
stories সংগ্রহের জন্য রিড অ্যাক্সেস বাড়ায় যাতে যেকোনও ব্যবহারকারী story ডকুমেন্ট
পড়তে পারেন যেখানে published ফিল্ড true হিসেবে সেট করা আছে।
service cloud.firestore {
match /databases/{database}/documents {
match /stories/{storyid} {
// Anyone can read a published story; only story authors can read unpublished stories
allow read: if resource.data.published == true || (request.auth != null && request.auth.uid == resource.data.author);
// Only story authors can write
allow write: if request.auth != null && request.auth.uid == resource.data.author;
}
}
}
প্রকাশিত পৃষ্ঠার জন্য কোয়েরিতে অবশ্যই নিরাপত্তা সংক্রান্ত নিয়মের মতো একই সীমাবদ্ধতা অন্তর্ভুক্ত করতে হবে:
db.collection("stories").where("published", "==", true).get()
কোয়েরি কনস্ট্রেন্ট .where("published", "==", true) গ্যারেন্টি দেয় যে
resource.data.published যেকোনও ফলাফলের জন্য true। তাই, এই কোয়েরি
নিরাপত্তা সংক্রান্ত নিয়ম মেনে চলে এবং ডেটা পড়ার অনুমতি পায়।
ORটি কোয়েরি
কোনও রুলসেটের সাপেক্ষে লজিক্যাল OR কোয়েরি (or, in বা array-contains-any)
মূল্যায়ন করার সময়, Rules প্রতিটি তুলনামূলক ভ্যালু
আলাদাভাবে মূল্যায়ন করে। প্রতিটি তুলনামূলক ভ্যালুকে অবশ্যই নিরাপত্তা সংক্রান্ত নিয়মের বাধ্যবাধকতা পূরণ করতে হবে। যেমন, নিম্নলিখিত নিয়মের
ক্ষেত্রে:
match /mydocuments/{doc} {
allow read: if resource.data.x > 5;
}
ভুল: কোয়েরি গ্যারেন্টি দেয় না যে
x > 5 সব সম্ভাব্য ডকুমেন্টের জন্য
// These queries will fail
query(db.collection("mydocuments"),
or(where("x", "==", 1),
where("x", "==", 6)
)
)
query(db.collection("mydocuments"),
where("x", "in", [1, 3, 6, 42, 99])
)
সঠিক: কোয়েরি গ্যারেন্টি দেয় যে
x > 5 সব সম্ভাব্য ডকুমেন্টের জন্য
query(db.collection("mydocuments"),
or(where("x", "==", 6),
where("x", "==", 42)
)
)
query(db.collection("mydocuments"),
where("x", "in", [6, 42, 99, 105, 200])
)
কোয়েরির উপর বিধিনিষেধ মূল্যায়ন করা হচ্ছে
আপনার নিরাপত্তা সংক্রান্ত নিয়ম, তার সীমাবদ্ধতার উপর ভিত্তি করে কোয়েরি গ্রহণ বা প্রত্যাখ্যান করতে পারে।
request.query ভেরিয়েবলে কোয়েরির limit, offset
এবং orderBy প্রপার্টি থাকে। যেমন, আপনার নিরাপত্তা সংক্রান্ত নিয়ম
এমন যেকোনও কোয়েরি বাতিল করতে পারে যা নির্দিষ্ট রেঞ্জের মধ্যে
সর্বাধিক সংখ্যক ডকুমেন্ট ফিরিয়ে আনার ক্ষেত্রে সীমাবদ্ধতা আরোপ করে না:
allow list: if request.query.limit <= 10;
নিচের রুলসেট থেকে বোঝা যায় যে কোয়েরির উপর আরোপিত সীমাবদ্ধতা মূল্যায়ন করে এমন নিরাপত্তা সংক্রান্ত নিয়ম কীভাবে লিখতে হয়। এই উদাহরণে নিম্নলিখিত পরিবর্তন সহ আগের stories
নিয়মাবলী আরও বিস্তারিতভাবে দেখানো হয়েছে:
- রুলসেট, পড়ার নিয়মকে
getএবংlist-এর জন্য নিয়মে আলাদা করে। getনিয়মটি পাবলিক ডকুমেন্ট বা ব্যবহারকারীর তৈরি করা ডকুমেন্টের ক্ষেত্রে একক ডকুমেন্ট পুনরুদ্ধার করার সুবিধা সীমিত করে।listনিয়মটিget-এর মতো একই বিধিনিষেধ প্রয়োগ করে, তবে কোয়েরির জন্য। এটি কোয়েরির সীমাও চেক করে, তারপর সীমা ছাড়া বা ১০-এর বেশি সীমা সহ যেকোনও কোয়েরি প্রত্যাখ্যান করে।- কোড ডুপ্লিকেশন এড়াতে রুলসেট একটি
authorOrPublished()ফাংশন সংজ্ঞায়িত করে।
service cloud.firestore {
match /databases/{database}/documents {
match /stories/{storyid} {
// Returns `true` if the requested story is 'published'
// or the user authored the story
function authorOrPublished() {
return resource.data.published == true || request.auth.uid == resource.data.author;
}
// Deny any query not limited to 10 or fewer documents
// Anyone can query published stories
// Authors can query their unpublished stories
allow list: if request.query.limit <= 10 &&
authorOrPublished();
// Anyone can retrieve a published story
// Only a story's author can retrieve an unpublished story
allow get: if authorOrPublished();
// Only a story's author can write to a story
allow write: if request.auth.uid == resource.data.author;
}
}
}
কালেকশন গ্রুপ কোয়েরি ও নিরাপত্তা সংক্রান্ত নিয়ম
ডিফল্ট হিসেবে, কোয়েরিগুলি একটি একক সংগ্রহে স্কোপ করা হয় এবং তারা শুধুমাত্র সেই সংগ্রহ থেকে ফলাফল পুনরুদ্ধার করে। কালেকশন গ্রুপ কোয়েরির মাধ্যমে আপনি একই আইডি সহ সব কালেকশন নিয়ে তৈরি কালেকশন গ্রুপ থেকে ফলাফল উদ্ধার করতে পারবেন। এই বিভাগে নিরাপত্তা সংক্রান্ত নিয়ম ব্যবহার করে কীভাবে আপনার কালেকশন গ্রুপ কোয়েরি সুরক্ষিত করবেন তা বর্ণনা করা হয়েছে।
কালেকশন গ্রুপের ভিত্তিতে ডকুমেন্ট সুরক্ষিত ও কোয়েরি করুন
আপনার নিরাপত্তা সংক্রান্ত নিয়মে, আপনাকে অবশ্যই স্পষ্টভাবে কালেকশন গ্রুপের জন্য একটি নিয়ম লিখে কালেকশন গ্রুপ কোয়েরির অনুমতি দিতে হবে:
- আপনার রুলসেটের প্রথম লাইনে
rules_version = '2';আছে কিনা তা নিশ্চিত করুন। কালেকশন গ্রুপ কোয়েরির জন্য নিরাপত্তা সংক্রান্ত নিয়মের ২ নম্বর ভার্সনের নতুন রিকার্সিভ ওয়াইল্ডকার্ড{name=**}আচরণ প্রয়োজন। match /{path=**}/[COLLECTION_ID]/{doc}ব্যবহার করে আপনার কালেকশন গ্রুপের জন্য একটি নিয়ম লিখুন।
যেমন, posts সাবকালেকশন সহ forumটি ডকুমেন্ট নিয়ে
গঠিত একটি ফোরামের কথা বিবেচনা করুন:
/forums/{forumid}/posts/{postid}
{
author: "some_auth_id",
authorname: "some_username",
content: "I just read a great story.",
}
এই অ্যাপ্লিকেশনে, আমরা পোস্টগুলি তাদের মালিকদের দ্বারা এডিটযোগ্য এবং যাচাইকৃত ব্যবহারকারীদের দ্বারা পাঠযোগ্য করে তুলি:
service cloud.firestore {
match /databases/{database}/documents {
match /forums/{forumid}/posts/{post} {
// Only authenticated users can read
allow read: if request.auth != null;
// Only the post author can write
allow write: if request.auth != null && request.auth.uid == resource.data.author;
}
}
}
যাচাই করা যেকোনও ব্যবহারকারী যেকোনও একটি ফোরামের পোস্ট ফিরিয়ে আনতে পারবেন:
db.collection("forums/technology/posts").get()
কিন্তু আপনি যদি বর্তমান ব্যবহারকারীকে সব ফোরাম জুড়ে তার পোস্ট দেখাতে চান তাহলে কী হবে?
আপনি কালেকশন গ্রুপ কোয়েরি ব্যবহার করে
সব posts কালেকশন থেকে ফলাফল পেতে পারেন:
var user = firebase.auth().currentUser;
db.collectionGroup("posts").where("author", "==", user.uid).get()
আপনার নিরাপত্তা সংক্রান্ত নিয়মে, posts কালেকশন গ্রুপের জন্য
রিড বা লিস্ট সংক্রান্ত নিয়ম লিখে আপনাকে অবশ্যই এই কোয়েরির অনুমতি দিতে হবে:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Authenticated users can query the posts collection group
// Applies to collection queries, collection group queries, and
// single document retrievals
match /{path=**}/posts/{post} {
allow read: if request.auth != null;
}
match /forums/{forumid}/posts/{postid} {
// Only a post's author can write to a post
allow write: if request.auth != null && request.auth.uid == resource.data.author;
}
}
}
তবে মনে রাখবেন, এই নিয়মগুলি posts আইডি সহ সব সংগ্রহের ক্ষেত্রে প্রযোজ্য হবে,
হায়ারার্কি যাই হোক না কেন। যেমন, এই নিয়মগুলি নিম্নলিখিত সবকটি
posts সংগ্রহের ক্ষেত্রে প্রযোজ্য:
/posts/{postid}/forums/{forumid}/posts/{postid}/forums/{forumid}/subforum/{subforumid}/posts/{postid}
কোনও ফিল্ডের উপর ভিত্তি করে কালেকশন গ্রুপের কোয়েরি সুরক্ষিত করা
সিঙ্গেল-কালেকশন কোয়েরির মতো, কালেকশন গ্রুপ কোয়েরিকেও আপনার নিরাপত্তা নিয়মের দ্বারা সেট করা সীমাবদ্ধতা
পূরণ করতে হবে। যেমন, আমরা প্রতিটি ফোরাম পোস্টে একটি published
ফিল্ড যোগ করতে পারি, যেমনটি আমরা উপরে stories উদাহরণে করেছি:
/forums/{forumid}/posts/{postid}
{
author: "some_auth_id",
authorname: "some_username",
content: "I just read a great story.",
published: false
}
আমরা তখন posts কালেকশন গ্রুপের জন্য published স্ট্যাটাস এবং পোস্ট author-এর উপর ভিত্তি করে নিয়ম লিখতে পারি:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Returns `true` if the requested post is 'published'
// or the user authored the post
function authorOrPublished() {
return resource.data.published == true || request.auth.uid == resource.data.author;
}
match /{path=**}/posts/{post} {
// Anyone can query published posts
// Authors can query their unpublished posts
allow list: if authorOrPublished();
// Anyone can retrieve a published post
// Authors can retrieve an unpublished post
allow get: if authorOrPublished();
}
match /forums/{forumid}/posts/{postid} {
// Only a post's author can write to a post
allow write: if request.auth.uid == resource.data.author;
}
}
}
এইসব নিয়মের মাধ্যমে, ওয়েব, Apple ও Android ক্লায়েন্ট নিম্নলিখিত কোয়েরি করতে পারে:
ফোরামে প্রকাশিত পোস্ট যেকেউ ফিরিয়ে আনতে পারবেন:
db.collection("forums/technology/posts").where('published', '==', true).get()যেকেউ সব ফোরাম জুড়ে লেখকের প্রকাশিত পোস্ট খুঁজে পেতে পারেন:
db.collectionGroup("posts").where("author", "==", "some_auth_id").where('published', '==', true).get()লেখক সব ফোরাম জুড়ে তার প্রকাশিত এবং অপ্রকাশিত সব পোস্ট উদ্ধার করতে পারবেন:
var user = firebase.auth().currentUser; db.collectionGroup("posts").where("author", "==", user.uid).get()
কালেকশন গ্রুপ ও ডকুমেন্ট পাথের ভিত্তিতে ডকুমেন্ট সুরক্ষিত ও কোয়েরি করুন
কিছু ক্ষেত্রে, আপনি ডকুমেন্ট পাথের উপর ভিত্তি করে কালেকশন গ্রুপ কোয়েরি সীমাবদ্ধ করতে চাইতে পারেন। এইসব বিধিনিষেধ তৈরি করতে, আপনি কোনও ফিল্ডের উপর ভিত্তি করে ডকুমেন্ট সুরক্ষিত করা এবং কোয়েরি করার জন্য একই টেকনিক ব্যবহার করতে পারেন।
এমন একটি অ্যাপ্লিকেশনের কথা ভাবুন যা একাধিক স্টক ও ক্রিপ্টোকারেন্সি এক্সচেঞ্জের মধ্যে প্রতিটি ব্যবহারকারীর ট্রানজ্যাকশনের ট্র্যাক রাখে:
/users/{userid}/exchange/{exchangeid}/transactions/{transaction}
{
amount: 100,
exchange: 'some_exchange_name',
timestamp: April 1, 2019 at 12:00:00 PM UTC-7,
user: "some_auth_id",
}
user ফিল্ডটি লক্ষ্য করুন। যদিও আমরা জানি যে কোন ব্যবহারকারী ডকুমেন্টের পাথ থেকে transaction
ডকুমেন্টের মালিক, আমরা প্রতিটি transaction ডকুমেন্টে এই তথ্য ডুপ্লিকেট করি
কারণ এটি আমাদের দুটি কাজ করতে দেয়:
কালেকশন গ্রুপ কোয়েরি লিখুন যা সেইসব ডকুমেন্টের মধ্যে সীমাবদ্ধ থাকে যেগুলির ডকুমেন্ট পাথে নির্দিষ্ট
/users/{userid}অন্তর্ভুক্ত থাকে। যেমন:var user = firebase.auth().currentUser; // Return current user's last five transactions across all exchanges db.collectionGroup("transactions").where("user", "==", user).orderBy('timestamp').limit(5)transactionsকালেকশন গ্রুপের সব কোয়েরির জন্য এই বিধিনিষেধ প্রয়োগ করুন যাতে একজন ব্যবহারকারী অন্য ব্যবহারকারীরtransactionডকুমেন্ট খুঁজে না পান।
আমরা আমাদের নিরাপত্তা সংক্রান্ত নিয়মে এই সীমাবদ্ধতা প্রয়োগ করি এবং user ফিল্ডের জন্য
ডেটা যাচাইকরণ অন্তর্ভুক্ত করি:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{path=**}/transactions/{transaction} {
// Authenticated users can retrieve only their own transactions
allow read: if resource.data.user == request.auth.uid;
}
match /users/{userid}/exchange/{exchangeid}/transactions/{transaction} {
// Authenticated users can write to their own transactions subcollections
// Writes must populate the user field with the correct auth id
allow write: if userid == request.auth.uid && request.data.user == request.auth.uid
}
}
}
পরবর্তী ধাপ
- রোল-বেসড অ্যাক্সেস কন্ট্রোলের আরও বিস্তারিত উদাহরণের জন্য, ব্যবহারকারী ও গ্রুপের জন্য ডেটা অ্যাক্সেস সুরক্ষিত করা দেখুন।
- নিরাপত্তা সংক্রান্ত নিয়মের রেফারেন্স পড়ুন।