Firebase Security Rules আপনাকে আপনার সঞ্চিত ডেটার অ্যাক্সেস নিয়ন্ত্রণ করতে দেয়। নমনীয় নিয়মের সিনট্যাক্স মানে আপনি এমন নিয়ম তৈরি করতে পারেন যা যেকোনো কিছুর সাথে মেলে, সমস্ত লেখা থেকে শুরু করে সম্পূর্ণ ডাটাবেস থেকে একটি নির্দিষ্ট নথিতে অপারেশন পর্যন্ত।
এই নির্দেশিকাটি আরও কিছু মৌলিক ব্যবহারের ক্ষেত্রে বর্ণনা করে যেগুলি আপনি প্রয়োগ করতে চান যখন আপনি আপনার অ্যাপ সেট আপ করতে এবং আপনার ডেটা সুরক্ষিত করতে চান৷ যাইহোক, আপনি নিয়ম লেখা শুরু করার আগে, আপনি হয়ত তারা যে ভাষায় লেখা হয়েছে এবং তাদের আচরণ সম্পর্কে আরও জানতে চাইতে পারেন।
আপনার নিয়মগুলি অ্যাক্সেস করতে এবং আপডেট করতে, Firebase Security Rules পরিচালনা এবং স্থাপনে বর্ণিত ধাপগুলি অনুসরণ করুন৷
ডিফল্ট নিয়ম: লক করা মোড
আপনি যখন Firebase কনসোলে একটি ডাটাবেস বা স্টোরেজ ইনস্ট্যান্স তৈরি করেন, তখন আপনি চয়ন করেন যে আপনার Firebase Security Rules আপনার ডেটা ( লকড মোড ) অ্যাক্সেস সীমিত করবে নাকি কাউকে অ্যাক্সেসের অনুমতি দেবে ( টেস্ট মোড )। Cloud Firestore এবং Realtime Database , লকড মোডের ডিফল্ট নিয়মগুলি সমস্ত ব্যবহারকারীর অ্যাক্সেস অস্বীকার করে৷ Cloud Storage , শুধুমাত্র প্রমাণীকৃত ব্যবহারকারীরা স্টোরেজ বালতি অ্যাক্সেস করতে পারেন।
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 false;
}
}
}
উন্নয়ন-পরিবেশ বিধি
আপনি যখন আপনার অ্যাপে কাজ করছেন, আপনি আপনার ডেটাতে তুলনামূলকভাবে খোলা বা নিরবচ্ছিন্ন অ্যাক্সেস চাইতে পারেন। আপনি আপনার অ্যাপকে প্রোডাকশনে স্থাপন করার আগে আপনার Rules আপডেট করতে ভুলবেন না। এছাড়াও মনে রাখবেন যে আপনি যদি আপনার অ্যাপটি স্থাপন করেন তবে এটি সর্বজনীনভাবে অ্যাক্সেসযোগ্য - এমনকি আপনি এটি চালু না করলেও৷
মনে রাখবেন যে ফায়ারবেস ক্লায়েন্টদের আপনার ডেটাতে সরাসরি অ্যাক্সেসের অনুমতি দেয় এবং Firebase Security Rules দূষিত ব্যবহারকারীদের জন্য অ্যাক্সেস ব্লক করার একমাত্র সুরক্ষা। পণ্যের যুক্তি থেকে আলাদাভাবে নিয়মগুলি সংজ্ঞায়িত করার অনেকগুলি সুবিধা রয়েছে: ক্লায়েন্টরা নিরাপত্তা প্রয়োগের জন্য দায়ী নয়, বগি বাস্তবায়ন আপনার ডেটার সাথে আপস করবে না এবং সবচেয়ে গুরুত্বপূর্ণভাবে, আপনি বিশ্ব থেকে ডেটা রক্ষা করার জন্য কোনও মধ্যস্থতাকারী সার্ভারের উপর নির্ভর করছেন না৷
সমস্ত প্রমাণীকৃত ব্যবহারকারী
যদিও আমরা সাইন ইন করা কোনো ব্যবহারকারীর কাছে আপনার ডেটা অ্যাক্সেসযোগ্য রাখার পরামর্শ দিই না, আপনি আপনার অ্যাপ তৈরি করার সময় যে কোনো প্রমাণীকৃত ব্যবহারকারীর কাছে অ্যাক্সেস সেট করা কার্যকর হতে পারে।
service cloud.firestore {
match /databases/{database}/documents {
match /some_collection/{document} {
allow read, write: if request.auth != null;
}
}
}
{
"rules": {
"some_path": {
".read": "auth.uid !== null",
".write": "auth.uid !== null"
}
}
}
service firebase.storage {
match /b/{bucket}/o {
match /some_folder/{fileName} {
allow read, write: if request.auth != null;
}
}
}
উত্পাদন-প্রস্তুত নিয়ম
আপনি যখন আপনার অ্যাপ স্থাপনের প্রস্তুতি নিচ্ছেন, নিশ্চিত করুন যে আপনার ডেটা সুরক্ষিত আছে এবং সেই অ্যাক্সেস আপনার ব্যবহারকারীদের যথাযথভাবে দেওয়া হয়েছে। ব্যবহারকারী-ভিত্তিক অ্যাক্সেস সেট আপ করতে Authentication ব্যবহার করুন এবং ডেটা-ভিত্তিক অ্যাক্সেস সেট আপ করতে আপনার ডাটাবেস থেকে সরাসরি পড়ুন।
আপনি আপনার ডেটা গঠন করার সময় লেখার নিয়মগুলি বিবেচনা করুন, যেহেতু আপনি যেভাবে আপনার নিয়মগুলি সেট আপ করেন তা প্রভাবিত করে আপনি কীভাবে বিভিন্ন পাথে ডেটা অ্যাক্সেস সীমাবদ্ধ করেন।
বিষয়বস্তু-মালিক শুধুমাত্র অ্যাক্সেস
এই নিয়মগুলি শুধুমাত্র সামগ্রীর প্রমাণীকৃত মালিকের অ্যাক্সেস সীমাবদ্ধ করে৷ ডেটা শুধুমাত্র একজন ব্যবহারকারী দ্বারা পঠনযোগ্য এবং লেখার যোগ্য, এবং ডেটা পাথে ব্যবহারকারীর আইডি থাকে।
যখন এই নিয়মটি কাজ করে: এই নিয়মটি ভাল কাজ করে যদি ব্যবহারকারী দ্বারা ডেটা সাইল করা হয় — যদি একমাত্র ব্যবহারকারীকে ডেটা অ্যাক্সেস করতে হয় যে একই ব্যবহারকারী ডেটা তৈরি করেছে।
যখন এই নিয়ম কাজ করে না: যখন একাধিক ব্যবহারকারীর একই ডেটা লিখতে বা পড়তে হয় তখন এই নিয়ম সেটটি কাজ করে না — ব্যবহারকারীরা ডেটা ওভাররাইট করবে বা তাদের তৈরি করা ডেটা অ্যাক্সেস করতে অক্ষম হবে।
এই নিয়ম সেট আপ করতে: এমন একটি নিয়ম তৈরি করুন যা নিশ্চিত করে যে ব্যবহারকারী ডেটা পড়তে বা লেখার অ্যাক্সেসের অনুরোধ করছেন সেই ব্যবহারকারী সেই ডেটার মালিক৷
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
}
}
}
{
"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>/file.txt"
match /user/{userId}/{fileName} {
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 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;
}
}
}
{
// 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>/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 এ একটি পঠিত অপারেশনের জন্য বিল দেওয়া হবে।
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 Authentication কাস্টম দাবি সেট আপ করুন এবং তারপরে আপনার নিয়মে দাবিগুলি ব্যবহার করুন৷
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";
}
}
}
{
"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"
}
}
}
}
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;
}
}