এই নির্দেশিকাটি Firebase Security Rules ভাষা নির্দেশিকার মূল বাক্য গঠন শেখার উপর ভিত্তি করে তৈরি, যাতে দেখানো হয় কিভাবে Cloud Storage জন্য Firebase Security Rules এ শর্তাবলী যোগ করতে হয়।
Cloud Storage Security Rules প্রাথমিক বিল্ডিং ব্লক হল শর্ত । একটি শর্ত হল একটি বুলিয়ান এক্সপ্রেশন যা নির্ধারণ করে যে কোনও নির্দিষ্ট ক্রিয়াকলাপ অনুমোদিত বা অস্বীকৃত হওয়া উচিত। মৌলিক নিয়মগুলির জন্য, শর্ত হিসাবে true এবং false লিটারেল ব্যবহার করা পুরোপুরি ভাল কাজ করে। কিন্তু Cloud Storage ভাষার জন্য Firebase Security Rules আপনাকে আরও জটিল শর্ত লেখার উপায় দেয় যা করতে পারে:
- ব্যবহারকারীর প্রমাণীকরণ পরীক্ষা করুন
- আগত তথ্য যাচাই করুন
প্রমাণীকরণ
Cloud Storage জন্য Firebase Security Rules Firebase Authentication সাথে একীভূত করে Cloud Storage শক্তিশালী ব্যবহারকারী-ভিত্তিক প্রমাণীকরণ প্রদান করে। এটি Firebase Authentication টোকেনের দাবির উপর ভিত্তি করে গ্রানুলার অ্যাক্সেস নিয়ন্ত্রণের অনুমতি দেয়।
যখন একজন প্রমাণিত ব্যবহারকারী Cloud Storage বিরুদ্ধে একটি অনুরোধ করেন, তখন request.auth ভেরিয়েবলটি ব্যবহারকারীর uid ( request.auth.uid ) এবং Firebase Authentication JWT ( request.auth.token ) এর দাবি দিয়ে পূর্ণ হয়।
অতিরিক্তভাবে, কাস্টম প্রমাণীকরণ ব্যবহার করার সময়, request.auth.token ক্ষেত্রে অতিরিক্ত দাবিগুলি দেখা যায়।
যখন একজন অননুমোদিত ব্যবহারকারী একটি অনুরোধ সম্পাদন করে, তখন request.auth ভেরিয়েবলটি null হয়।
এই ডেটা ব্যবহার করে, ফাইলগুলি সুরক্ষিত করার জন্য প্রমাণীকরণ ব্যবহার করার বেশ কয়েকটি সাধারণ উপায় রয়েছে:
- সর্বজনীন:
request.authউপেক্ষা করুন - প্রমাণীকরণকৃত ব্যক্তিগত: পরীক্ষা করুন যে
request.authnullনয় - ব্যবহারকারীর ব্যক্তিগত: পরীক্ষা করুন যে
request.auth.uidএকটি পাথuidসমান - গ্রুপ প্রাইভেট: কাস্টম টোকেনের দাবিগুলি একটি নির্বাচিত দাবির সাথে মেলে কিনা তা পরীক্ষা করুন, অথবা কোনও মেটাডেটা ক্ষেত্র বিদ্যমান কিনা তা দেখতে ফাইল মেটাডেটা পড়ুন।
পাবলিক
যে কোনও নিয়ম যা request.auth প্রসঙ্গ বিবেচনা করে না তাকে একটি public নিয়ম হিসাবে বিবেচনা করা যেতে পারে, কারণ এটি ব্যবহারকারীর প্রমাণীকরণ প্রসঙ্গ বিবেচনা করে না। এই নিয়মগুলি গেম সম্পদ, সাউন্ড ফাইল বা অন্যান্য স্ট্যাটিক কন্টেন্টের মতো সর্বজনীন ডেটা সারফেস করার জন্য কার্যকর হতে পারে।
// Anyone to read a public image if the file is less than 100kB // Anyone can upload a public file ending in '.txt' match /public/{imageId} { allow read: if resource.size < 100 * 1024; allow write: if imageId.matches(".*\\.txt"); }
প্রমাণিত ব্যক্তিগত
কিছু ক্ষেত্রে, আপনি চাইতে পারেন যে আপনার অ্যাপ্লিকেশনের সকল প্রমাণিত ব্যবহারকারীরা ডেটা দেখতে পান, কিন্তু অপ্রমাণিত ব্যবহারকারীরা তা দেখতে পান না। যেহেতু সমস্ত অপ্রমাণিত ব্যবহারকারীদের জন্য request.auth ভেরিয়েবলটি null , তাই প্রমাণীকরণের জন্য আপনাকে যা করতে হবে তা হল request.auth ভেরিয়েবলটি বিদ্যমান আছে কিনা তা পরীক্ষা করা:
// Require authentication on all internal image reads match /internal/{imageId} { allow read: if request.auth != null; }
ব্যবহারকারীর ব্যক্তিগত
এখন পর্যন্ত request.auth এর সবচেয়ে সাধারণ ব্যবহারের ক্ষেত্রে হবে পৃথক ব্যবহারকারীদের তাদের ফাইলগুলিতে ছোট ছোট অনুমতি প্রদান করা: প্রোফাইল ছবি আপলোড করা থেকে শুরু করে ব্যক্তিগত নথি পড়া পর্যন্ত।
যেহেতু Cloud Storage ফাইলগুলিতে ফাইলের একটি সম্পূর্ণ "পথ" থাকে, তাই ব্যবহারকারী দ্বারা নিয়ন্ত্রিত একটি ফাইল তৈরি করতে কেবল ফাইলের নাম উপসর্গে (যেমন ব্যবহারকারীর uid ) অনন্য, ব্যবহারকারী শনাক্তকারী তথ্যের একটি অংশ লাগে যা নিয়মটি মূল্যায়ন করার সময় পরীক্ষা করা যেতে পারে:
// Only a user can upload their profile picture, but anyone can view it match /users/{userId}/profilePicture.png { allow read; allow write: if request.auth.uid == userId; }
গ্রুপ প্রাইভেট
আরেকটি সমানভাবে সাধারণ ব্যবহারের ক্ষেত্রে, কোনও বস্তুর উপর গ্রুপ অনুমতি দেওয়া হবে, যেমন একাধিক দলের সদস্যকে একটি ভাগ করা নথিতে সহযোগিতা করার অনুমতি দেওয়া। এটি করার জন্য বেশ কয়েকটি পদ্ধতি রয়েছে:
- একটি Firebase Authentication কাস্টম টোকেন মিন্ট করুন যাতে কোনও গ্রুপ সদস্য সম্পর্কে অতিরিক্ত তথ্য থাকে (যেমন একটি গ্রুপ আইডি)
- ফাইল মেটাডেটাতে গ্রুপ তথ্য (যেমন একটি গ্রুপ আইডি বা অনুমোদিত
uidগুলির তালিকা) অন্তর্ভুক্ত করুন।
একবার এই ডেটা টোকেন বা ফাইল মেটাডেটাতে সংরক্ষণ করা হলে, এটি একটি নিয়মের মধ্যে থেকে উল্লেখ করা যেতে পারে:
// 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; }
মূল্যায়নের অনুরোধ করুন
Cloud Storage পাঠানো request ব্যবহার করে আপলোড, ডাউনলোড, মেটাডেটা পরিবর্তন এবং মুছে ফেলার মূল্যায়ন করা হয়। উপরে বর্ণিত request.auth অবজেক্টে ব্যবহারকারীর অনন্য আইডি এবং Firebase Authentication পেলোড ছাড়াও, request ভেরিয়েবলে অনুরোধটি সম্পাদন করা হচ্ছে এমন ফাইল পাথ, অনুরোধটি গ্রহণের সময় এবং অনুরোধটি লেখা হলে নতুন resource মান অন্তর্ভুক্ত থাকে।
request বস্তুতে ব্যবহারকারীর অনন্য আইডি এবং request.auth বস্তুতে Firebase Authentication পেলোডও থাকে, যা ডক্সের ব্যবহারকারী-ভিত্তিক সুরক্ষা বিভাগে আরও ব্যাখ্যা করা হবে।
request বস্তুর বৈশিষ্ট্যের একটি সম্পূর্ণ তালিকা নীচে পাওয়া যাবে:
| সম্পত্তি | আদর্শ | বিবরণ |
|---|---|---|
auth | মানচিত্র<স্ট্রিং, স্ট্রিং> | যখন একজন ব্যবহারকারী লগ ইন করেন, তখন uid , ব্যবহারকারীর অনন্য আইডি এবং token , Firebase Authentication JWT দাবির একটি মানচিত্র প্রদান করেন। অন্যথায়, এটি null হবে। |
params | মানচিত্র<স্ট্রিং, স্ট্রিং> | অনুরোধের কোয়েরি প্যারামিটার সম্বলিত মানচিত্র। |
path | পথ | অনুরোধটি যে পথে সম্পাদিত হচ্ছে তার প্রতিনিধিত্বকারী একটি path । |
resource | মানচিত্র<স্ট্রিং, স্ট্রিং> | নতুন রিসোর্স মান, শুধুমাত্র write অনুরোধে উপস্থিত। |
time | টাইমস্ট্যাম্প | একটি টাইমস্ট্যাম্প যা সার্ভারের অনুরোধটি মূল্যায়নের সময়কে প্রতিনিধিত্ব করে। |
সম্পদ মূল্যায়ন
নিয়ম মূল্যায়ন করার সময়, আপনি আপলোড, ডাউনলোড, পরিবর্তন বা মুছে ফেলা ফাইলের মেটাডেটাও মূল্যায়ন করতে চাইতে পারেন। এটি আপনাকে জটিল এবং শক্তিশালী নিয়ম তৈরি করতে দেয় যা কেবলমাত্র নির্দিষ্ট ধরণের সামগ্রী সহ ফাইল আপলোড করার অনুমতি দেয়, অথবা শুধুমাত্র একটি নির্দিষ্ট আকারের চেয়ে বড় ফাইল মুছে ফেলার অনুমতি দেয়।
Cloud Storage জন্য Firebase Security Rules resource অবজেক্টে ফাইল মেটাডেটা প্রদান করে, যার মধ্যে Cloud Storage অবজেক্টে উপস্থিত মেটাডেটার কী/মান জোড়া থাকে। ডেটা অখণ্ডতা নিশ্চিত করার জন্য এই বৈশিষ্ট্যগুলি read বা write অনুরোধে পরিদর্শন করা যেতে পারে।
write অনুরোধে (যেমন আপলোড, মেটাডেটা আপডেট এবং ডিলিট) resource অবজেক্ট ছাড়াও, যেখানে রিকোয়েস্ট পাথে বর্তমানে বিদ্যমান ফাইলের জন্য ফাইল মেটাডেটা থাকে, আপনার কাছে request.resource অবজেক্টটি ব্যবহার করার ক্ষমতাও রয়েছে, যেখানে লেখার অনুমতি থাকলে লেখার জন্য ফাইল মেটাডেটার একটি উপসেট থাকে। আপনি ডেটা অখণ্ডতা নিশ্চিত করতে বা ফাইলের ধরণ বা আকারের মতো অ্যাপ্লিকেশন সীমাবদ্ধতা প্রয়োগ করতে এই দুটি মান ব্যবহার করতে পারেন।
resource অবজেক্টের বৈশিষ্ট্যের একটি সম্পূর্ণ তালিকা নীচে পাওয়া যাবে:
| সম্পত্তি | আদর্শ | বিবরণ |
|---|---|---|
name | স্ট্রিং | বস্তুর পুরো নাম |
bucket | স্ট্রিং | এই বস্তুটি যে বালতিতে থাকে তার নাম। |
generation | int-এর মাধ্যমে | এই অবজেক্টের Google Cloud Storage অবজেক্ট জেনারেশন । |
metageneration | int-এর মাধ্যমে | এই অবজেক্টের Google Cloud Storage অবজেক্ট মেটাজেনারেশন । |
size | int-এর মাধ্যমে | বাইটে বস্তুর আকার। |
timeCreated | টাইমস্ট্যাম্প | একটি টাইমস্ট্যাম্প যা একটি বস্তু তৈরির সময়কে প্রতিনিধিত্ব করে। |
updated | টাইমস্ট্যাম্প | একটি টাইমস্ট্যাম্প যা একটি অবজেক্টের সর্বশেষ আপডেটের সময়কে প্রতিনিধিত্ব করে। |
md5Hash | স্ট্রিং | বস্তুর একটি MD5 হ্যাশ। |
crc32c | স্ট্রিং | বস্তুর একটি crc32c হ্যাশ। |
etag | স্ট্রিং | এই বস্তুর সাথে সম্পর্কিত etag। |
contentDisposition | স্ট্রিং | এই বস্তুর সাথে সম্পর্কিত বিষয়বস্তুর অবস্থান। |
contentEncoding | স্ট্রিং | এই অবজেক্টের সাথে সম্পর্কিত কন্টেন্ট এনকোডিং। |
contentLanguage | স্ট্রিং | এই অবজেক্টের সাথে সম্পর্কিত কন্টেন্ট ভাষা। |
contentType | স্ট্রিং | এই বস্তুর সাথে সম্পর্কিত বিষয়বস্তুর ধরণ। |
metadata | মানচিত্র<স্ট্রিং, স্ট্রিং> | অতিরিক্ত, ডেভেলপার-নির্দিষ্ট কাস্টম মেটাডেটার কী/মান জোড়া। |
request.resource generation , metageneration , etag , timeCreated এবং updated ছাড়া এগুলো সবই রয়েছে।
Cloud Firestore সাহায্যে উন্নত করুন
অন্যান্য অনুমোদনের মানদণ্ড মূল্যায়নের জন্য আপনি Cloud Firestore নথিগুলি অ্যাক্সেস করতে পারেন।
firestore.get() এবং firestore.exists() ফাংশন ব্যবহার করে, আপনার নিরাপত্তা নিয়মগুলি Cloud Firestore এ ডকুমেন্টের বিরুদ্ধে আগত অনুরোধগুলি মূল্যায়ন করতে পারে। firestore.get() এবং firestore.exists() ফাংশন উভয়ই সম্পূর্ণরূপে নির্দিষ্ট ডকুমেন্ট পাথ আশা করে। firestore.get() এবং firestore.exists() এর জন্য পাথ তৈরি করতে ভেরিয়েবল ব্যবহার করার সময়, আপনাকে $(variable) সিনট্যাক্স ব্যবহার করে স্পষ্টভাবে ভেরিয়েবলগুলি এস্কেপ করতে হবে।
নীচের উদাহরণে, আমরা একটি নিয়ম দেখতে পাচ্ছি যা নির্দিষ্ট ক্লাবের সদস্যদের জন্য ফাইল পড়ার অ্যাক্সেস সীমাবদ্ধ করে।
service firebase.storage {
match /b/{bucket}/o {
match /users/{club}/files/{fileId} {
allow read: if club in
firestore.get(/databases/(default)/documents/users/$(request.auth.id)).data.memberships
}
}
}service firebase.storage {
match /b/{bucket}/o {
match /users/{userId}/photos/{fileId} {
allow read: if
firestore.exists(/databases/(default)/documents/users/$(userId)/friends/$(request.auth.id))
}
}
}একবার আপনি আপনার প্রথম Cloud Storage Security Rules তৈরি এবং সংরক্ষণ করলে যা এই Cloud Firestore ফাংশনগুলি ব্যবহার করে, আপনাকে Firebase কনসোল বা Firebase CLI-তে দুটি পণ্য সংযোগ করার অনুমতি সক্ষম করতে বলা হবে।
আপনি Firebase Security Rules Manage and deploy এ বর্ণিত IAM ভূমিকাটি সরিয়ে বৈশিষ্ট্যটি অক্ষম করতে পারেন।
তথ্য যাচাই করুন
Cloud Storage জন্য Firebase Security Rules ডেটা যাচাইকরণের জন্যও ব্যবহার করা যেতে পারে, যার মধ্যে ফাইলের নাম এবং পথ যাচাই করা এবং সেইসাথে ফাইল মেটাডেটা বৈশিষ্ট্য যেমন contentType এবং size অন্তর্ভুক্ত।
service firebase.storage { match /b/{bucket}/o { match /images/{imageId} { // Only allow uploads of any image file that's less than 5MB allow write: if request.resource.size < 5 * 1024 * 1024 && request.resource.contentType.matches('image/.*'); } } }
কাস্টম ফাংশন
আপনার Firebase Security Rules আরও জটিল হয়ে উঠার সাথে সাথে, আপনি আপনার নিয়ম সেট জুড়ে পুনরায় ব্যবহার করতে পারেন এমন ফাংশনগুলিতে শর্তগুলির সেটগুলি মোড়ানোর কথা ভাবতে পারেন। নিরাপত্তা নিয়মগুলি কাস্টম ফাংশনগুলিকে সমর্থন করে। কাস্টম ফাংশনগুলির সিনট্যাক্সটি কিছুটা জাভাস্ক্রিপ্টের মতো, তবে Firebase Security Rules ফাংশনগুলি একটি ডোমেন-নির্দিষ্ট ভাষায় লেখা হয় যার কিছু গুরুত্বপূর্ণ সীমাবদ্ধতা রয়েছে:
- ফাংশনগুলিতে কেবল একটি
returnস্টেটমেন্ট থাকতে পারে। এতে কোনও অতিরিক্ত লজিক থাকতে পারে না। উদাহরণস্বরূপ, তারা লুপ এক্সিকিউট করতে বা বহিরাগত পরিষেবা কল করতে পারে না। - ফাংশনগুলি স্বয়ংক্রিয়ভাবে ফাংশন এবং ভেরিয়েবলগুলিকে সেই স্কোপে অ্যাক্সেস করতে পারে যেখানে সেগুলি সংজ্ঞায়িত করা হয়েছে। উদাহরণস্বরূপ,
service firebase.storageস্কোপের মধ্যে সংজ্ঞায়িত একটি ফাংশনেরresourceভেরিয়েবলে অ্যাক্সেস রয়েছে এবং শুধুমাত্র Cloud Firestore জন্য, অন্তর্নির্মিত ফাংশন যেমনget()এবংexists()। - ফাংশনগুলি অন্যান্য ফাংশনগুলিকে কল করতে পারে কিন্তু পুনরাবৃত্তি নাও করতে পারে। মোট কল স্ট্যাকের গভীরতা 10 এর মধ্যে সীমাবদ্ধ।
- ভার্সন
rules2তে, ফাংশনগুলিletকীওয়ার্ড ব্যবহার করে ভেরিয়েবল সংজ্ঞায়িত করতে পারে। ফাংশনগুলিতে যেকোনো সংখ্যক let বাইন্ডিং থাকতে পারে, তবে একটি রিটার্ন স্টেটমেন্ট দিয়ে শেষ হতে হবে।
একটি ফাংশন function কীওয়ার্ড দিয়ে সংজ্ঞায়িত করা হয় এবং শূন্য বা তার বেশি আর্গুমেন্ট লাগে। উদাহরণস্বরূপ, আপনি উপরের উদাহরণগুলিতে ব্যবহৃত দুটি ধরণের শর্তকে একটি একক ফাংশনে একত্রিত করতে চাইতে পারেন:
service firebase.storage {
match /b/{bucket}/o {
// True if the user is signed in or the requested data is 'public'
function signedInOrPublic() {
return request.auth.uid != null || resource.data.visibility == 'public';
}
match /images/{imageId} {
allow read, write: if signedInOrPublic();
}
match /mp3s/{mp3Ids} {
allow read: if signedInOrPublic();
}
}
}
আপনার Firebase Security Rules এ ফাংশন ব্যবহার করলে আপনার রুলসের জটিলতা বৃদ্ধির সাথে সাথে এগুলোকে আরও রক্ষণাবেক্ষণযোগ্য করে তোলে।
পরবর্তী পদক্ষেপ
শর্তাবলীর এই আলোচনার পর, আপনি নিয়ম সম্পর্কে আরও পরিশীলিত ধারণা পেয়েছেন এবং প্রস্তুত:
মূল ব্যবহারের ক্ষেত্রে কীভাবে পরিচালনা করতে হয় তা শিখুন, এবং নিয়মগুলি বিকাশ, পরীক্ষা এবং স্থাপনের জন্য কর্মপ্রবাহ শিখুন:
- সাধারণ পরিস্থিতি মোকাবেলা করার জন্য নিয়ম লিখুন।
- অনিরাপদ নিয়মগুলি চিহ্নিত করে এড়িয়ে চলার জন্য পরিস্থিতি পর্যালোচনা করে আপনার জ্ঞান বৃদ্ধি করুন।
- Cloud Storage এমুলেটর এবং ডেডিকেটেড সিকিউরিটি রুলস টেস্ট লাইব্রেরি ব্যবহার করে নিয়ম পরীক্ষা করুন।
- Rules স্থাপনের জন্য উপলব্ধ পদ্ধতিগুলি পর্যালোচনা করুন।