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

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

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

আপনার নিয়ম অ্যাক্সেস ও আপডেট করতে, Firebase Security Rules ম্যানেজ ও ডিপ্লয় করুন নিবন্ধে উল্লেখ করা ধাপগুলি অনুসরণ করুন।

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

ডিফল্ট নিয়ম: লক করা মোড

Firebase কনসোলে ডেটাবেস বা স্টোরেজ ইনস্ট্যান্স তৈরি করার সময়, আপনার Firebase Security Rules ডেটা অ্যাক্সেস করার ক্ষেত্রে বিধিনিষেধ আরোপ করবে (লক করা মোড) নাকি যেকোনও ব্যক্তিকে অ্যাক্সেস করার অনুমতি দেবে (টেস্ট মোড) তা বেছে নিতে পারবেন। Cloud Firestore এবং Realtime Database-এ, লক করা মোড-এর ডিফল্ট নিয়ম সব ব্যবহারকারীর অ্যাক্সেস প্রত্যাখ্যান করে। Cloud Storage-এ, শুধুমাত্র যাচাই করা ব্যবহারকারীরা স্টোরেজ বাকেট অ্যাক্সেস করতে পারবেন।

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Realtime Database

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

Cloud Storage

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

ডেভেলপমেন্ট-এনভায়রনমেন্ট সংক্রান্ত নিয়ম

আপনার অ্যাপে কাজ করার সময়, আপনি তুলনামূলকভাবে খোলা বা অবাধ অ্যাক্সেস চাইতে পারেন আপনার ডেটাতে। প্রোডাকশনে আপনার অ্যাপ ডিপ্লয় করার আগে আপনার Security Rules আপডেট করতে ভুলবেন না। এছাড়াও মনে রাখবেন যে আপনি অ্যাপ ডিপ্লয় করলে, সেটি সর্বজনীনভাবে অ্যাক্সেসযোগ্য হয়ে যায় — এমনকি আপনি সেটি লঞ্চ না করলেও।

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

যাচাই করা সব ব্যবহারকারী

সাইন-ইন করা যেকোনও ব্যবহারকারীর জন্য আপনার ডেটা অ্যাক্সেসযোগ্য রাখার সাজেশন আমরা দিই না, তবে আপনার অ্যাপ ডেভেলপ করার সময় যেকোনও যাচাই করা ব্যবহারকারীর জন্য অ্যাক্সেস সেট করা উপযোগী হতে পারে।

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      ".read": "auth.uid !== null",
      ".write": "auth.uid !== null"
    }
  }
}

Cloud Storage

service firebase.storage {
  match /b/{bucket}/o {
    match /some_folder/{fileName} {
      allow read, write: if request.auth != null;
    }
  }
}

প্রোডাকশন-রেডি নিয়ম

আপনার অ্যাপ ডিপ্লয় করার জন্য প্রস্তুত হওয়ার সময়, আপনার ডেটা সুরক্ষিত আছে কিনা এবং আপনার ব্যবহারকারীদের সঠিকভাবে অ্যাক্সেস দেওয়া হয়েছে কিনা তা নিশ্চিত করুন। ব্যবহারকারী-ভিত্তিক অ্যাক্সেস সেট-আপ করতে Authentication ব্যবহার করুন এবং ডেটা-ভিত্তিক অ্যাক্সেস সেট-আপ করতে আপনার ডেটাবেস থেকে সরাসরি পড়ুন।

আপনার ডেটা স্ট্রাকচার করার সময় নিয়ম লেখার কথা বিবেচনা করুন, কারণ আপনি যেভাবে নিয়ম সেট-আপ করেন তা বিভিন্ন পাথে ডেটার অ্যাক্সেস সীমাবদ্ধ করার পদ্ধতিকে প্রভাবিত করে।

শুধুমাত্র কন্টেন্টের মালিকের অ্যাক্সেস

এইসব নিয়ম শুধুমাত্র কন্টেন্টের যাচাই করা মালিকের অ্যাক্সেস সীমাবদ্ধ করে। ডেটা শুধুমাত্র একজন ব্যবহারকারী পড়তে এবং লিখতে পারবেন এবং ডেটা পাথে ব্যবহারকারীর আইডি রয়েছে।

এই নিয়ম কখন কাজ করে: ব্যবহারকারী ডেটা সাইলো করলে এই নিয়ম ভালভাবে কাজ করে — যদি যে ব্যবহারকারী ডেটা তৈরি করেছেন শুধু তিনিই ডেটা অ্যাক্সেস করতে চান।

এই নিয়ম কখন কাজ করে না: একাধিক ব্যবহারকারীকে একই ডেটা লিখতে বা পড়তে হলে এই নিয়মাবলী কাজ করে না — ব্যবহারকারীরা ডেটা ওভাররাইট করে ফেলবেন অথবা তাদের তৈরি করা ডেটা অ্যাক্সেস করতে পারবেন না।

এই নিয়ম সেট-আপ করতে: এমন একটি নিয়ম তৈরি করুন যা নিশ্চিত করে যে ডেটা পড়া বা লেখার জন্য অ্যাক্সেসের অনুরোধ করা ব্যবহারকারীই সেই ডেটার মালিক।

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{userId}/{document} {
      allow read, write: if request.auth != null && request.auth.uid == userId
    }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "$uid": {
        // Allow only authenticated content owners access to their data
        ".read": "auth !== null && auth.uid === $uid",
        ".write": "auth !== null && auth.uid === $uid"
      }
    }
  }
}

Cloud Storage

// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/file.txt"
    match /user/{userId}/{fileName} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

সর্বজনীন ও ব্যক্তিগত অ্যাক্সেস মিক্স করা আছে

এই নিয়ম যেকোনও ব্যক্তিকে ডেটাসেট পড়ার অনুমতি দেয়, তবে নির্দিষ্ট পাথে ডেটা তৈরি বা পরিবর্তন করার ক্ষমতা শুধুমাত্র যাচাই করা কন্টেন্টের মালিকের মধ্যেই সীমাবদ্ধ রাখে।

এই নিয়ম কখন কাজ করে: এই নিয়ম সেইসব অ্যাপের ক্ষেত্রে ভাল কাজ করে যেগুলির জন্য সর্বজনীনভাবে পড়া যায় এমন এলিমেন্ট প্রয়োজন, কিন্তু সেইসব এলিমেন্টের মালিকদের এডিট অ্যাক্সেস সীমিত করতে হয়। যেমন, চ্যাট অ্যাপ বা ব্লগ।

এই নিয়ম কখন কাজ করে না: কন্টেন্ট-মালিকের জন্য প্রযোজ্য নিয়মের মতোই, একাধিক ব্যবহারকারীকে একই ডেটা এডিট করতে হলে এই নিয়ম কাজ করে না। ব্যবহারকারীরা একে অপরের ডেটা ওভাররাইট করে ফেলবেন।

এই নিয়ম সেট-আপ করতে: এমন একটি নিয়ম তৈরি করুন যা সব ব্যবহারকারীকে (অথবা সব যাচাই করা ব্যবহারকারীকে) পড়ার অ্যাক্সেস দেয় এবং ডেটা লেখা ব্যবহারকারীই যে মালিক তা কনফার্ম করে।

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      // Allow public reads
      allow read: if true
      // Allow creation if the current user owns the new document
      allow create: if request.auth.uid == request.resource.data.author_uid;
      // Allow updates by the owner, and prevent change of ownership
      allow update: if request.auth.uid == request.resource.data.author_uid
                    && request.auth.uid == resource.data.author_uid;
      // Allow deletion if the current user owns the existing document
      allow delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}

Realtime Database

{
// Allow anyone to read data, but only authenticated content owners can
// make changes to their data

  "rules": {
    "some_path": {
      "$uid": {
        ".read": true,
        // or ".read": "auth.uid !== null" for only authenticated users
        ".write": "auth.uid === $uid"
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/file.txt"
    match /user/{userId}/{fileName} {
      allow read;
      allow write: if request.auth.uid == userId;
    }
  }
}

অ্যাট্রিবিউট-ভিত্তিক এবং ভূমিকা-ভিত্তিক অ্যাক্সেস

এই নিয়ম কাজ করার জন্য, আপনার ডেটাতে ব্যবহারকারীদের জন্য অ্যাট্রিবিউট নির্ধারণ ও অ্যাসাইন করতে হবে। Firebase Security Rules অ্যাক্সেস কনফার্ম বা বাতিল করতে, আপনার ডেটাবেস বা ফাইলের মেটাডেটা থেকে পাওয়া ডেটার সাথে অনুরোধটি মিলিয়ে দেখে।

এই নিয়ম কখন কাজ করে: আপনি ব্যবহারকারীদের কোনও ভূমিকা অ্যাসাইন করলে, এই নিয়ম আপনাকে ভূমিকা বা ব্যবহারকারীদের নির্দিষ্ট গ্রুপের ভিত্তিতে অ্যাক্সেস সীমিত করতে দেয়। যেমন, আপনি যদি গ্রেড স্টোর করেন, তাহলে "ছাত্র" গ্রুপ (শুধু তাদের কন্টেন্ট পড়তে পারবে), "শিক্ষক" গ্রুপ (তাদের বিষয়ে পড়তে ও লিখতে পারবে) এবং "অধ্যক্ষ" গ্রুপকে (সব কন্টেন্ট পড়তে পারবে) আলাদা আলাদা অ্যাক্সেস লেভেল অ্যাসাইন করতে পারবেন।

এই নিয়ম কখন কাজ করে না: Realtime Database এবং Cloud Storage-এ, আপনার নিয়ম get() পদ্ধতি ব্যবহার করতে পারে না যা Cloud Firestore নিয়ম অন্তর্ভুক্ত করতে পারে। এর ফলে, আপনার নিয়মে ব্যবহার করা অ্যাট্রিবিউট দেখানোর জন্য, আপনার ডেটাবেস বা ফাইল মেটাডেটা স্ট্রাকচার করতে হবে।

এই নিয়ম সেট-আপ করতে: Cloud Firestore-এ, আপনার ব্যবহারকারীদের ডকুমেন্টে এমন একটি ফিল্ড অন্তর্ভুক্ত করুন যা আপনি পড়তে পারবেন, তারপর সেই ফিল্ডটি পড়ার জন্য আপনার নিয়ম স্ট্রাকচার করুন এবং শর্তসাপেক্ষে অ্যাক্সেস দিন। Realtime Database-এ, একটি ডেটা পাথ তৈরি করুন যা আপনার অ্যাপের ব্যবহারকারীদের সংজ্ঞায়িত করে এবং তাদের একটি চাইল্ড নোডে ভূমিকা প্রদান করে।

এছাড়াও, আপনি Authentication-এ কাস্টম দাবি সেট-আপ করতে এবং তারপর যেকোনও Firebase Security Rules-এ auth.token ভেরিয়েবল থেকে সেই তথ্য ফিরিয়ে আনতে পারবেন।

ডেটা-নির্ধারিত অ্যাট্রিবিউট ও ভূমিকা

এইসব নিয়ম শুধুমাত্র Cloud Firestore ও Realtime Database-এ কাজ করে।

Cloud Firestore

মনে রাখবেন, আপনার নিয়মে যেকোনও সময় রিড অপারেশন অন্তর্ভুক্ত থাকলে, যেমন নিচের নিয়ম, আপনাকে Cloud Firestore-এ রিড অপারেশনের জন্য বিল করা হবে।

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, Check a boolean `admin` attribute
    allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"
   }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "${subpath}": {
        //
        ".write": "root.child('users').child(auth.uid).child('role').val() === 'admin'",
        ".read": true
      }
    }
  }
}

কাস্টম-দাবি অ্যাট্রিবিউট ও ভূমিকা

এইসব নিয়ম প্রয়োগ করতে, Firebase Authentication-এ কাস্টম দাবি সেট-আপ করুন এবং তারপর আপনার নিয়মে দাবিগুলি ব্যবহার করুন।

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an administrator claim
    allow write: if request.auth.token.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if request.auth.token.reader == "true";
     allow write: if request.auth.token.writer == "true";
   }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "$uid": {
        // Create a custom claim for each role or group
        // you want to use
        ".write": "auth.uid !== null && auth.token.writer === true",
        ".read": "auth.uid !== null && auth.token.reader === true"
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  // Allow reads if the group ID in your token matches the file metadata's `owner` property
  // Allow writes if the group ID is in the user's custom token
  match /files/{groupId}/{fileName} {
    allow read: if resource.metadata.owner == request.auth.token.groupId;
    allow write: if request.auth.token.groupId == groupId;
  }
}

ভাড়া সংক্রান্ত অ্যাট্রিবিউট

এইসব নিয়ম প্রয়োগ করতে, Google Cloud Identity Platform (GCIP)-এ মাল্টিটেনেন্সি সেট-আপ করুন এবং তারপর আপনার নিয়মে টেন্যান্ট ব্যবহার করুন। নিম্নলিখিত উদাহরণগুলি নির্দিষ্ট টেন্যান্টে ব্যবহারকারীকে লেখার অনুমতি দেয়, যেমন, tenant2-m6tyz

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // For tenant-based access control, check for a tenantID
    allow write: if request.auth.token.firebase.tenant == 'tenant2-m6tyz';
    allow read: true;
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "$uid": {
        // Only allow reads and writes if user belongs to a specific tenant
        ".write": "auth.uid !== null && auth.token.firebase.tenant === 'tenant2-m6tyz'",
        ".read": "auth.uid !== null
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  // Only allow reads and writes if user belongs to a specific tenant
  match /files/{tenantId}/{fileName} {
    allow read: if request.auth != null;
    allow write: if request.auth.token.firebase.tenant == tenantId;
  }
}