Firebase Security Rules এমন একটি ফরম্যাটে অ্যাক্সেস কন্ট্রোল এবং ডেটা ভ্যালিডেশন প্রদান করে যা বিভিন্ন স্তরের জটিলতা সমর্থন করে। আপনার ব্যবহারকারীদের ডেটা সুরক্ষিত রাখে এমন ইউজার-ভিত্তিক এবং রোল-ভিত্তিক অ্যাক্সেস সিস্টেম তৈরি করতে, Firebase Security Rules সাথে Firebase Authentication ব্যবহার করুন।
ব্যবহারকারীদের শনাক্ত করুন
Authentication আপনার ডেটাতে অ্যাক্সেসের অনুরোধকারী ব্যবহারকারীদের শনাক্ত করে এবং সেই তথ্যটি একটি ভেরিয়েবল হিসেবে প্রদান করে, যা আপনি আপনার নিয়মগুলিতে ব্যবহার করতে পারেন। auth ভেরিয়েবলটিতে নিম্নলিখিত তথ্য থাকে:
-
uid: অনুরোধকারী ব্যবহারকারীকে বরাদ্দ করা একটি অনন্য ব্যবহারকারী আইডি। -
token: Authentication দ্বারা সংগৃহীত মানগুলির একটি ম্যাপ।
auth.token ভেরিয়েবলটিতে নিম্নলিখিত মানগুলি রয়েছে:
| মাঠ | বর্ণনা |
|---|---|
email | অ্যাকাউন্টের সাথে যুক্ত ইমেল ঠিকানা, যদি থাকে। |
email_verified | যদি ব্যবহারকারী যাচাই করে থাকেন যে email ঠিকানাটিতে তার প্রবেশাধিকার আছে, তবে true । কিছু পরিষেবা প্রদানকারী তাদের মালিকানাধীন ইমেল ঠিকানাগুলো স্বয়ংক্রিয়ভাবে যাচাই করে। |
phone_number | অ্যাকাউন্টের সাথে যুক্ত ফোন নম্বর, যদি থাকে। |
name | ব্যবহারকারীর প্রদর্শিত নাম, যদি সেট করা থাকে। |
sub | ব্যবহারকারীর ফায়ারবেস ইউআইডি। এটি একটি প্রোজেক্টের মধ্যে অনন্য। |
firebase.identities | এই ব্যবহারকারীর অ্যাকাউন্টের সাথে যুক্ত সমস্ত পরিচয়ের একটি ডিকশনারি। ডিকশনারিটির কী (key) নিম্নলিখিতগুলির যেকোনো একটি হতে পারে: email , phone , google.com , facebook.com , github.com , twitter.com । ডিকশনারিটির ভ্যালু (value) হলো অ্যাকাউন্টের সাথে যুক্ত প্রতিটি আইডেন্টিটি প্রোভাইডারের জন্য অনন্য শনাক্তকারীর অ্যারে। উদাহরণস্বরূপ, auth.token.firebase.identities["google.com"][0] এ অ্যাকাউন্টের সাথে যুক্ত প্রথম গুগল ইউজার আইডি রয়েছে। |
firebase.sign_in_provider | এই টোকেনটি পেতে ব্যবহৃত সাইন-ইন প্রদানকারী। এটি নিম্নলিখিত স্ট্রিংগুলির মধ্যে একটি হতে পারে: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com । |
firebase.tenant | অ্যাকাউন্টের সাথে যুক্ত tenantId, যদি থাকে। যেমন tenant2-m6tyz |
আপনি যদি কাস্টমাইজড অথেনটিকেশন অ্যাট্রিবিউট যোগ করতে চান, তাহলে auth.token ভেরিয়েবলটিতে আপনার নির্দিষ্ট করা যেকোনো কাস্টম ক্লেইমও অন্তর্ভুক্ত থাকে।
যখন অ্যাক্সেসের অনুরোধকারী ব্যবহারকারী সাইন ইন করা থাকেন না, তখন auth ভেরিয়েবলটির মান null হয়। আপনি আপনার রুলসে এটি ব্যবহার করতে পারেন, যেমন—যদি আপনি শুধুমাত্র অথেনটিকেটেড ব্যবহারকারীদের জন্য রিড অ্যাক্সেস সীমিত করতে চান ( auth != null )। তবে, আমরা সাধারণত রাইট অ্যাক্সেস আরও সীমিত করার পরামর্শ দিই।
auth ভেরিয়েবল সম্পর্কে আরও তথ্যের জন্য, Cloud Firestore , Realtime Database , এবং Cloud Storage এর রেফারেন্স ডকুমেন্টেশন দেখুন।
নিয়ম তৈরিতে ব্যবহারকারীর তথ্য ব্যবহার করুন
বাস্তবে, আপনার নিয়মে প্রমাণীকৃত তথ্য ব্যবহার করলে তা আরও শক্তিশালী ও নমনীয় হয়ে ওঠে। আপনি ব্যবহারকারীর পরিচয়ের ভিত্তিতে ডেটাতে প্রবেশাধিকার নিয়ন্ত্রণ করতে পারেন।
আপনার নিয়মে নির্ধারণ করুন, auth ভেরিয়েবলের তথ্য—অর্থাৎ অনুরোধকারীর ব্যবহারকারীর তথ্য—অনুরোধকৃত ডেটার সাথে যুক্ত ব্যবহারকারীর তথ্যের সাথে কীভাবে মেলে।
উদাহরণস্বরূপ, আপনার অ্যাপ হয়তো নিশ্চিত করতে চাইতে পারে যে ব্যবহারকারীরা শুধুমাত্র তাদের নিজেদের ডেটা পড়তে ও লিখতে পারবে। এই পরিস্থিতিতে, আপনি চাইবেন যে auth.uid ভেরিয়েবল এবং অনুরোধ করা ডেটার ইউজার আইডির মধ্যে একটি মিল থাকুক:
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// Make sure the uid of the requesting user matches name of the user
// document. The wildcard expression {userId} makes the userId variable
// available in rules.
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
Realtime Database
{
"rules": {
"users": {
"$userId": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($userId)
".write": "$userId === auth.uid"
}
}
}
}
Cloud Storage
service firebase.storage {
// Only a user can upload their file, but anyone can view it
match /users/{userId}/{fileName} {
allow read;
allow write: if request.auth != null && request.auth.uid == userId;
}
}
কাস্টম ব্যবহারকারীর তথ্য সংজ্ঞায়িত করুন
আপনি আপনার অ্যাপের ব্যবহারকারীদের জন্য কাস্টম ফিল্ড নির্ধারণ করতে auth ভেরিয়েবলটি আরও কাজে লাগাতে পারেন।
উদাহরণস্বরূপ, ধরুন আপনি একটি "অ্যাডমিন" রোল তৈরি করতে চান যা নির্দিষ্ট পাথে লেখার অ্যাক্সেস দেবে। আপনি ব্যবহারকারীদের সেই অ্যাট্রিবিউটটি দেবেন এবং তারপরে পাথগুলিতে অ্যাক্সেস দেওয়ার নিয়মগুলিতে এটি ব্যবহার করবেন।
Cloud Firestore , আপনি ব্যবহারকারীদের ডকুমেন্টে একটি কাস্টম ফিল্ড যোগ করতে পারেন এবং আপনার রুলে একটি এমবেডেড রিড ব্যবহার করে সেই ফিল্ডের ভ্যালু পুনরুদ্ধার করতে পারেন। সুতরাং, আপনার অ্যাডমিন-ভিত্তিক রুলটি নিম্নলিখিত উদাহরণের মতো দেখাবে:
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents/some_collection: {
// Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin == true;
read: if request.auth != null;
}
}
Authentication এ কাস্টম ক্লেইম তৈরি করার পর, আপনি Security Rules এ সেই কাস্টম ক্লেইমগুলো অ্যাক্সেস করতে পারবেন। এরপর আপনি auth.token ভেরিয়েবল ব্যবহার করে সেই কাস্টম ক্লেইমগুলোকে রেফারেন্স করতে পারবেন।
Cloud Firestore
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";
}
}
}
Realtime Database
{
"rules": {
"some_path": {
"$sub_path": {
// Create a custom claim for the admin role
".write": "auth.uid !== null && auth.token.writer === true",
".read": "auth.uid !== null"
}
}
}
}
Cloud Storage
service firebase.storage {
// Create a custom claim for the admin role
match /files/{fileName} {
allow read: if request.auth.uid != null;
allow write: if request.auth.token.admin == true;
}
}
Authentication ব্যবহার করে তৈরি মৌলিক Security Rules আরও উদাহরণ দেখতে, মৌলিক নিরাপত্তা নিয়মসমূহ দেখুন।