মৌলিক নিরাপত্তা নিয়ম

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

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

আপনার নিয়মগুলি অ্যাক্সেস করতে এবং আপডেট করতে, Firebase সুরক্ষা নিয়ম পরিচালনা এবং স্থাপনে বর্ণিত ধাপগুলি অনুসরণ করুন৷

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

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

ক্লাউড ফায়ারস্টোর

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

রিয়েলটাইম ডাটাবেস

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

মেঘ স্টোরেজ

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

উন্নয়ন-পরিবেশ বিধি

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

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

সমস্ত প্রমাণীকৃত ব্যবহারকারী

যদিও আমরা সাইন ইন করা কোনো ব্যবহারকারীর কাছে আপনার ডেটা অ্যাক্সেসযোগ্য রাখার পরামর্শ দিই না, আপনি আপনার অ্যাপ তৈরি করার সময় যে কোনো প্রমাণীকৃত ব্যবহারকারীর কাছে অ্যাক্সেস সেট করা কার্যকর হতে পারে।

ক্লাউড ফায়ারস্টোর

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

রিয়েলটাইম ডাটাবেস

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

মেঘ স্টোরেজ

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

উত্পাদন-প্রস্তুত নিয়ম

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

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

বিষয়বস্তু-মালিক শুধুমাত্র অ্যাক্সেস

এই নিয়মগুলি শুধুমাত্র সামগ্রীর প্রমাণীকৃত মালিকের অ্যাক্সেস সীমাবদ্ধ করে৷ ডেটা শুধুমাত্র একজন ব্যবহারকারী দ্বারা পঠনযোগ্য এবং লেখার যোগ্য, এবং ডেটা পাথে ব্যবহারকারীর আইডি থাকে।

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

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

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

ক্লাউড ফায়ারস্টোর

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

রিয়েলটাইম ডাটাবেস

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

মেঘ স্টোরেজ

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

মিশ্র পাবলিক এবং ব্যক্তিগত অ্যাক্সেস

এই নিয়ম যে কাউকে একটি ডেটা সেট পড়ার অনুমতি দেয়, কিন্তু শুধুমাত্র প্রমাণীকৃত বিষয়বস্তুর মালিকের কাছে প্রদত্ত পথে ডেটা তৈরি বা পরিবর্তন করার ক্ষমতা সীমাবদ্ধ করে।

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

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

এই নিয়মটি সেট আপ করতে: এমন একটি নিয়ম তৈরি করুন যা সমস্ত ব্যবহারকারীর (বা সমস্ত প্রমাণীকৃত ব্যবহারকারী) পড়ার অ্যাক্সেস সক্ষম করে এবং ব্যবহারকারীর লেখার ডেটা মালিক বলে নিশ্চিত করে৷

ক্লাউড ফায়ারস্টোর

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow create: if request.auth.uid == request.resource.data.author_uid;
      allow update, delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}

রিয়েলটাইম ডাটাবেস

{
// 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"
      }
    }
  }
}

মেঘ স্টোরেজ

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

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

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

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

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

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

আপনি প্রমাণীকরণে কাস্টম দাবি সেট আপ করতে পারেন এবং তারপরে যে কোনো ফায়ারবেস নিরাপত্তা নিয়মে auth.token ভেরিয়েবল থেকে সেই তথ্য পুনরুদ্ধার করতে পারেন।

ডেটা-সংজ্ঞায়িত বৈশিষ্ট্য এবং ভূমিকা

এই নিয়মগুলি শুধুমাত্র ক্লাউড ফায়ারস্টোর এবং রিয়েলটাইম ডেটাবেসে কাজ করে৷

ক্লাউড ফায়ারস্টোর

মনে রাখবেন যে কোনো সময় আপনার নিয়মে একটি পঠন অন্তর্ভুক্ত থাকে, যেমন নীচের নিয়মগুলি, আপনাকে ক্লাউড ফায়ারস্টোরে একটি পঠিত অপারেশনের জন্য বিল দেওয়া হবে৷

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

রিয়েলটাইম ডাটাবেস

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

কাস্টম-দাবি বৈশিষ্ট্য এবং ভূমিকা

এই নিয়মগুলি বাস্তবায়ন করতে, Firebase প্রমাণীকরণে কাস্টম দাবি সেট আপ করুন এবং তারপর আপনার নিয়মে দাবিগুলিকে লিভারেজ করুন৷

ক্লাউড ফায়ারস্টোর

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an admin 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";
   }
  }
}

রিয়েলটাইম ডাটাবেস

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

মেঘ স্টোরেজ

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 ক্লাউড আইডেন্টিটি প্ল্যাটফর্মে (GCIP) মাল্টিটেন্যান্সি সেট আপ করুন এবং তারপরে আপনার নিয়মে ভাড়াটেকে সুবিধা দিন৷ নিম্নলিখিত উদাহরণগুলি একটি নির্দিষ্ট ভাড়াটে যেমন tenant2-m6tyz এ ব্যবহারকারীর কাছ থেকে লেখার অনুমতি দেয়

ক্লাউড ফায়ারস্টোর

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

রিয়েলটাইম ডাটাবেস

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

মেঘ স্টোরেজ

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