ফায়ারবেস ডেটাবেস নিরাপত্তা নিয়ম API

নিয়ম: প্রকার

.পড়ুন

একটি Firebase রিয়েলটাইম ডেটাবেস অবস্থানে একটি ক্লায়েন্ট পড়ার অ্যাক্সেস মঞ্জুর করে৷

একটি .read নিয়ম হল এক ধরনের নিরাপত্তা নিয়ম যা একটি ক্লায়েন্টকে ফায়ারবেস রিয়েলটাইম ডেটাবেস অবস্থানে পড়ার অ্যাক্সেস দেয়। উদাহরণ স্বরূপ:

 ".read": "auth != null && auth.provider == 'twitter'"

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

একটি .read নিয়মের newData ব্যতীত Firebase রিয়েলটাইম ডেটাবেসের সমস্ত নিয়ম ভেরিয়েবলের অ্যাক্সেস রয়েছে।

.লিখুন

একটি Firebase রিয়েলটাইম ডেটাবেস অবস্থানে একটি ক্লায়েন্ট লেখার অ্যাক্সেস মঞ্জুর করে৷

একটি .write নিয়ম হল এক ধরনের নিরাপত্তা নিয়ম যা একটি ক্লায়েন্টকে ফায়ারবেস রিয়েলটাইম ডেটাবেস অবস্থানে লেখার অ্যাক্সেস দেয়। উদাহরণ স্বরূপ:

".write": "auth != null && auth.token.isAdmin == true"

একটি .write নিয়মের মান হল একটি স্ট্রিং, যা জাভাস্ক্রিপ্টের এক্সপ্রেশন সিনট্যাক্সের একটি উপসেট হিসাবে মূল্যায়ন করা হয় স্বচ্ছতা এবং সঠিকতা বৃদ্ধির জন্য কিছু আচরণগত পরিবর্তনের সাথে। একটি .write নিয়ম যা একটি অবস্থানে লেখার অনুমতি দেয় সেটি সেই অবস্থানের যেকোনো বংশধরকে লেখার অনুমতি দেয়, এমনকি যদি বংশধরদের নিজস্ব .write নিয়ম থাকে যা ব্যর্থ হয়।

একটি .write নিয়মের সমস্ত Firebase রিয়েলটাইম ডাটাবেসের নিয়ম ভেরিয়েবলের অ্যাক্সেস আছে।

যাচাই করুন

লিখিত ডেটা একটি নির্দিষ্ট স্কিমার সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করার জন্য .write নিয়ম অ্যাক্সেস দেওয়ার পরে একবার ব্যবহার করা হয়।

একটি .validate নিয়ম একবার অ্যাক্সেস দেওয়ার পরে একটি .write নিয়ম ব্যবহার করা হয়, যাতে লেখা ডেটা একটি নির্দিষ্ট মানদণ্ডের সাথে সামঞ্জস্যপূর্ণ হয় তা নিশ্চিত করতে। একটি .write মঞ্জুর করার অ্যাক্সেস ছাড়াও, সমস্ত প্রাসঙ্গিক .validate নিয়মগুলি অবশ্যই একটি লেখার অনুমতি দেওয়ার আগে সফল হতে হবে৷ উদাহরণ স্বরূপ:

".validate": "newData.hasChildren(['name', 'age'])"

একটি .validate নিয়মের মান হল একটি স্ট্রিং, যা জাভাস্ক্রিপ্টের এক্সপ্রেশন সিনট্যাক্সের একটি উপসেট হিসাবে মূল্যায়ন করা হয় স্বচ্ছতা এবং সঠিকতা বাড়াতে কিছু আচরণগত পরিবর্তনের সাথে।

একটি .validate নিয়মের সমস্ত Firebase রিয়েলটাইম ডেটাবেসের নিয়ম ভেরিয়েবলের অ্যাক্সেস আছে।

.indexOn

ফায়ারবেস রিয়েলটাইম ডেটাবেসকে আপনি কোন কীগুলিকে আপনার ডেটা ইন্ডেক্স করতে চান তা বলে ক্যোয়ারী কর্মক্ষমতা উন্নত করে৷

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

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

আপনি .indexOn নিয়ম সম্পর্কে আরও তথ্য জানতে পারবেন আপনার ডেটা ইন্ডেক্স করার জন্য নিরাপত্তা গাইডের বিভাগটি উল্লেখ করে।

নিয়ম: ভেরিয়েবল

প্রমাণ

একটি ভেরিয়েবল যাতে টোকেন পেলোড থাকে যদি কোনো ক্লায়েন্ট প্রমাণীকৃত হয়, অথবা ক্লায়েন্ট প্রমাণীকৃত না হলে null

ফায়ারবেস রিয়েলটাইম ডেটাবেস আপনাকে বেশ কয়েকটি বিল্ট-ইন প্রদানকারীকে সহজেই প্রমাণীকরণ করতে দেয় এবং তাদের জন্য প্রমাণীকরণ টোকেন তৈরি করবে। একজন ব্যবহারকারী বিল্ট-ইন প্রদানকারীর সাথে প্রমাণীকরণ করার পরে, প্রমাণীকরণ ভেরিয়েবলে নিম্নলিখিতগুলি থাকবে:

মাঠ বর্ণনা
provider প্রমাণীকরণ পদ্ধতি ব্যবহার করা হয়েছে (যেমন "পাসওয়ার্ড", "বেনামী", "ফেসবুক", "গিথুব", "গুগল", বা "টুইটার")।
uid একটি অনন্য ব্যবহারকারী আইডি, সমস্ত প্রদানকারীর জন্য অনন্য হওয়ার নিশ্চয়তা।
token Firebase Auth ID টোকেনের বিষয়বস্তু। auth.token দেখুন।

উদাহরণ স্বরূপ, ব্যবহারকারীরা যতক্ষণ পর্যন্ত মন্তব্যের সাথে তাদের ব্যবহারকারী আইডি সংরক্ষণ করে ততক্ষণ মন্তব্য তৈরি করার অনুমতি দেওয়ার জন্য আমাদের নিম্নলিখিতগুলির মতো একটি নিয়ম থাকতে পারে:

{
  "rules": {
    ".read": true,
    "$comment": {
      ".write": "!data.exists() && newData.child('user_id').val() == auth.uid"
    }
  }
}

ব্যবহারকারীরা যতক্ষণ পর্যন্ত Facebook ব্যবহার করে সাইন ইন করে থাকবেন ততক্ষণ মন্তব্য তৈরি করার অনুমতি দেওয়ার জন্য আমরা নিম্নলিখিতগুলির মতো একটি নিয়মও তৈরি করতে পারি:

{
  "rules": {
    ".read": true,
    "$comment": {
      ".write": "!data.exists() && auth.provider == 'facebook'"
    }
  }
}

auth.token

Firebase Auth ID টোকেনের বিষয়বস্তু ধারণকারী একটি পরিবর্তনশীল।

টোকেনে নিচের কিছু বা সমস্ত কী রয়েছে:

মাঠ বর্ণনা
email অ্যাকাউন্টের সাথে যুক্ত ইমেল ঠিকানা, যদি উপস্থিত থাকে।
email_verified true যদি ব্যবহারকারী যাচাই করে থাকে যে তাদের email ঠিকানায় অ্যাক্সেস আছে। কিছু প্রদানকারী স্বয়ংক্রিয়ভাবে তাদের মালিকানাধীন ইমেল ঠিকানা যাচাই করে।
phone_number অ্যাকাউন্টের সাথে যুক্ত ফোন নম্বর, যদি উপস্থিত থাকে।
name ব্যবহারকারীর প্রদর্শনের নাম, যদি সেট করা থাকে।
sub ব্যবহারকারীর Firebase UID. এটি একটি প্রকল্পের মধ্যে অনন্য।
firebase.identities এই ব্যবহারকারীর অ্যাকাউন্টের সাথে যুক্ত সমস্ত পরিচয়ের অভিধান। অভিধানের কীগুলি নিম্নলিখিতগুলির মধ্যে যেকোনো একটি হতে পারে: email , phone , google.com , facebook.com , github.com , twitter.com । অভিধানের মান হল অ্যাকাউন্টের সাথে যুক্ত প্রতিটি পরিচয় প্রদানকারীর জন্য অনন্য শনাক্তকারীর অ্যারে। উদাহরণস্বরূপ, auth.token.firebase.identities["google.com"][0] এ অ্যাকাউন্টের সাথে যুক্ত প্রথম Google ব্যবহারকারী আইডি রয়েছে৷
firebase.sign_in_provider সাইন-ইন প্রদানকারী এই টোকেনটি পেতে ব্যবহৃত নিম্নলিখিত স্ট্রিংগুলির মধ্যে একটি হতে পারে: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com
firebase.tenant অ্যাকাউন্টের সাথে সংশ্লিষ্ট ভাড়াটে আইডি, যদি উপস্থিত থাকে। যেমন tenant2-m6tyz

কাস্টম প্রমাণীকরণ ব্যবহার করলে, auth.token ডেভেলপারের দ্বারা নির্দিষ্ট করা কোনও কাস্টম দাবিও থাকে।

এই সমস্ত মান নিয়মের মধ্যে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, একটি gmail.com ঠিকানার সাথে যুক্ত Google অ্যাকাউন্টগুলিতে অ্যাক্সেস সীমাবদ্ধ করতে, আমরা নিয়মটি যোগ করতে পারি:

{
  "rules": {
    ".read": "auth != null",
    "gmailUsers": {
      "$uid": {
        ".write": "auth.token.email_verified == true && auth.token.email.matches(/.*@gmail.com$/)"
      }
    }
  }
}

সম্পূর্ণতার জন্য, নিম্নলিখিত ক্ষেত্রগুলিও অন্তর্ভুক্ত করা হয়েছে, auth.token এ, তবে সেগুলি নিয়মের জন্য কার্যকর হওয়ার সম্ভাবনা কম।

মাঠ বর্ণনা
iss টোকেন প্রদানকারী।
aud টোকেনের জন্য দর্শক।
auth_time টোকেন গ্রহণকারী ডিভাইসটি ব্যবহার করে ব্যবহারকারী শেষবার একটি শংসাপত্রের সাথে প্রমাণীকরণ করেছেন।
iat যে সময়ে টোকেন জারি করা হয়েছিল।
exp টোকেনের মেয়াদ শেষ হওয়ার সময়।

$অবস্থান

একটি ভেরিয়েবল যা একটি $location কী রেফারেন্স করতে ব্যবহার করা যেতে পারে যা আগে একটি নিয়ম কাঠামোতে ব্যবহৃত হয়েছিল।

যখন আপনার নিয়ম কাঠামোতে একটি $location থাকে, তখন আপনি প্রকৃত শিশুর পড়া বা লেখার নাম পেতে আপনার রুল এক্সপ্রেশনের মধ্যে একটি ম্যাচিং $ ভেরিয়েবল ব্যবহার করতে পারেন। তাই ধরুন আমরা প্রত্যেক ব্যবহারকারীকে তাদের নিজস্ব /users/<user> অবস্থানে পড়ার এবং লেখার অ্যাক্সেস দিতে চাই। আমরা ব্যবহার করতে পারি:

{
  "rules": {
    "users": {
      "$user": {
        ".read": "auth.uid === $user",
        ".write": "auth.uid === $user"
      }
    }
  }
}

যখন একজন ক্লায়েন্ট /users/barney অ্যাক্সেস করার চেষ্টা করে, তখন $user ডিফল্ট অবস্থানটি $user এর সাথে মিলবে "barney" এর সমান। সুতরাং .read নিয়মটি auth.uid === 'barney' কিনা তা পরীক্ষা করবে। ফলস্বরূপ, /users/barney পড়া শুধুমাত্র তখনই সফল হবে যদি ক্লায়েন্ট "barney" এর একটি uid দিয়ে প্রমাণীকৃত হয়।

এখন

ফায়ারবেস রিয়েলটাইম ডেটাবেস সার্ভার অনুসারে ইউনিক্স যুগ থেকে মিলিসেকেন্ডের সংখ্যা রয়েছে।

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

{
  "rules": {
    "users": {
      "$user": {
        "created": {
          ".validate": "newData.val() < now"
        }
      }
    }
  }
}

মূল

আপনার ফায়ারবেস রিয়েলটাইম ডেটাবেসের রুটে বর্তমান ডেটার সাথে সম্পর্কিত একটি RuleDataSnapshot

রুট ভেরিয়েবল আপনাকে আপনার ফায়ারবেস রিয়েলটাইম ডেটাবেসের রুটে বর্তমান ডেটার সাথে সম্পর্কিত একটি RuleDataSnapshot দেয়। আপনি আপনার নিয়মের অভিব্যক্তিতে আপনার ডাটাবেসের যেকোনো ডেটা পড়তে এটি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি আমরা ব্যবহারকারীদের /comments পড়ার অনুমতি দিতে চাই শুধুমাত্র যদি তাদের /users/<id>/active সত্যে সেট করা থাকে, আমরা ব্যবহার করতে পারি:

{
  "rules": {
    "comments": {
      ".read": "root.child('users').child(auth.uid).child('active').val() == true"
    }
  }
}

তারপর, যদি /users/barney/active মানটি সত্য থাকে, তাহলে "barney" এর একটি uid দিয়ে প্রমাণীকৃত ব্যবহারকারী /comments নোডে লিখতে পারে।

তথ্য

একটি RuleDataSnapshot যা বর্তমানে কার্যকর করা নিয়মের অবস্থানে Firebase রিয়েলটাইম ডেটাবেসের বর্তমান ডেটার সাথে সম্পর্কিত।

ডেটা ভেরিয়েবল আপনাকে একটি RuleDataSnapshot দেয় যা বর্তমানে কার্যকর করা নিয়মের ডাটাবেসের অবস্থানের বর্তমান ডেটার সাথে সম্পর্কিত (রুটের বিপরীতে, যা আপনাকে আপনার ডাটাবেসের রুটের জন্য ডেটা দেয়)।

সুতরাং উদাহরণস্বরূপ, আপনি যদি কোনও ক্লায়েন্টকে /users/<user> অ্যাক্সেস করতে দিতে চান যদি /users/<user>/public সত্য হিসাবে সেট করা হয়, আপনি ব্যবহার করতে পারেন:

{
  "rules": {
    "users": {
      "$user": {
        ".read": "data.child('public').val() == true"
      }
    }
  }
}

ডেটা ভেরিয়েবলটি .read , .write , এবং .validate নিয়মে পাওয়া যায়৷

নতুন ডেটা

একটি RuleDataSnapshot তথ্যের সাথে সম্পর্কিত যা লেখার অনুমতি দিলে ফলাফল হবে।

.write এবং .validate নিয়মগুলির জন্য, newData ভেরিয়েবল আপনাকে ডেটার সাথে সম্পর্কিত একটি RuleDataSnapshot দেয় যা লেখার অনুমতি দেওয়া হলে ফলাফল হবে (এটি বিদ্যমান ডেটা এবং নতুন ডেটা লেখার একটি "একত্রীকরণ")। তাই আপনি যদি নিশ্চিত করতে চান যে প্রতিটি ব্যবহারকারীর একটি নাম এবং বয়স আছে, আপনি ব্যবহার করতে পারেন:

{
  "rules": {
    "users": {
      "$user": {
        ".read": true,
        ".write": true,
        ".validate": "newData.hasChildren(['name', 'age'])"
      }
    }
  }
}

যেহেতু newData বিদ্যমান ডেটা এবং নতুন ডেটা একত্রিত করে, এটি "আংশিক" আপডেটের জন্যও সঠিকভাবে আচরণ করে। উদাহরণ স্বরূপ:

var fredRef = firebase.database().ref("users/fred");
// Valid since we have a name and age.
fredRef.set({ name: "Fred", age: 19 });
// Valid since we are updating the name but there's already an age.
fredRef.child("age").set(27);
// Invalid since the .validate rule will no longer be true.
fredRef.child("name").remove();

নতুন ডেটা ভেরিয়েবলটি .read নিয়মে উপলব্ধ নেই কারণ সেখানে কোনও নতুন ডেটা লেখা হচ্ছে না। আপনার শুধু ডেটা ব্যবহার করা উচিত।

RuleDataSnapshot: পদ্ধতি

ভাল()

এই RuleDataSnapshot থেকে আদিম মান ( string , number , boolean বা null ) পায়।

রিটার্ন মান : ( String , Number , Boolean , Null ) - এই RuleDataSnapshot থেকে আদিম মান।

DataSnapshot.val() এর বিপরীতে, val() একটি RuleDataSnapshot-এ কল করলে শিশুর ডেটা আছে এমন কোনো বস্তু ফেরত আসবে না। এটি পরিবর্তে একটি বিশেষ সেন্টিনেল মান ফিরিয়ে দেবে। এটি নিশ্চিত করে যে নিয়মগুলি সর্বদা অত্যন্ত দক্ষতার সাথে কাজ করতে পারে।

ফলস্বরূপ, শিশুদের অ্যাক্সেস করার জন্য আপনাকে সর্বদা child() ব্যবহার করতে হবে (যেমন data.child('name').val() , data.val().name ) নয়।

এই উদাহরণটি শুধুমাত্র পড়ার অনুমতি দেয় যদি isReadable চাইল্ডটি পঠিত স্থানে সত্য হিসাবে সেট করা থাকে।

".read": "data.child('isReadable').val() == true"

শিশু()

নির্দিষ্ট আপেক্ষিক পাথে অবস্থানের জন্য একটি RuleDataSnapshot পায়।

আর্গুমেন্ট : childPath String - চাইল্ড ডেটার অবস্থানের একটি আপেক্ষিক পথ।

রিটার্ন ভ্যালু : RuleDataSnapshot - শিশু অবস্থানের জন্য RuleDataSnapshot

আপেক্ষিক পথটি হয় একটি সাধারণ শিশুর নাম (যেমন 'ফ্রেড') অথবা একটি গভীর স্ল্যাশ-বিচ্ছিন্ন পথ (যেমন 'ফ্রেড/নাম/প্রথম') হতে পারে। যদি চাইল্ড লোকেশনে কোনো ডেটা না থাকে, তাহলে একটি খালি RuleDataSnapshot ফেরত দেওয়া হয়।

এই উদাহরণটি শুধুমাত্র পড়ার অনুমতি দেয় যদি isReadable চাইল্ডটি পঠিত স্থানে সত্য হিসাবে সেট করা থাকে।

".read": "data.child('isReadable').val() == true"

পিতামাতা()

মূল অবস্থানের জন্য একটি RuleDataSnapshot পায়।

রিটার্ন মান : RuleDataSnapshot - মূল অবস্থানের জন্য RuleDataSnapshot

যদি এই উদাহরণটি আপনার ফায়ারবেস রিয়েলটাইম ডেটাবেসের মূলকে নির্দেশ করে, তবে এটির কোনো অভিভাবক নেই, এবং parent() ব্যর্থ হবে, যার ফলে বর্তমান নিয়মের অভিব্যক্তিটি এড়িয়ে যাবে (ব্যর্থতা হিসাবে)।

এই উদাহরণটি শুধুমাত্র পড়ার অনুমতি দেয় যদি isReadable ভাইবোন সত্যে সেট করা থাকে।

".read": "data.parent().child('isReadable').val() == true"

hasChild(childPath)

নির্দিষ্ট শিশু বিদ্যমান থাকলে সত্য প্রদান করে।

আর্গুমেন্ট : childPath String - একটি সম্ভাব্য সন্তানের অবস্থানের একটি আপেক্ষিক পথ।

রিটার্ন ভ্যালু : বুলিয়ান - true যদি নির্দিষ্ট চাইল্ড পাথে ডেটা থাকে; অন্যথায় false

এই উদাহরণটি শুধুমাত্র ডেটা লেখার অনুমতি দেয় যদি এতে একটি শিশুর "নাম" থাকে।

".validate": "newData.hasChild('name')"

hasChildren([শিশুদের])

বাচ্চাদের অস্তিত্ব পরীক্ষা করে।

আর্গুমেন্ট : children Array ঐচ্ছিক - চাইল্ড কীগুলির একটি অ্যারে যা অবশ্যই বিদ্যমান থাকবে।

রিটার্ন ভ্যালু : Boolean - true যদি (নির্দিষ্ট) বাচ্চারা থাকে; অন্যথায় false

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

এই উদাহরণটি শুধুমাত্র ডেটা লেখার অনুমতি দেয় যদি এতে এক বা একাধিক শিশু থাকে।

".validate": "newData.hasChildren()"

এই উদাহরণটি শুধুমাত্র ডেটা লেখার অনুমতি দেয় যদি এতে "নাম" এবং "বয়স" শিশু থাকে।

".validate": "newData.hasChildren(['name', 'age'])"

বিদ্যমান()

এই RuleDataSnapshot- এ কোনো ডেটা থাকলে সত্য ফেরত দেয়।

রিটার্ন মান : Boolean - true যদি RuleDataSnapshot-এ কোনো ডেটা থাকে; অন্যথায় false

যদি এই RuleDataSnapshot-এ কোনো ডেটা থাকে তাহলে বিদ্যমান ফাংশনটি সত্য হয়। এটি সম্পূর্ণরূপে একটি সুবিধাজনক ফাংশন যেহেতু data.exists() data.val() != null এর সমতুল্য।

এই উদাহরণটি এই অবস্থানে একটি লেখার অনুমতি দেয় যতক্ষণ পর্যন্ত কোনও বিদ্যমান ডেটা নেই৷

".write": "!data.exists()"

অগ্রাধিকার পান()

একটি RuleDataSnapshot- এ ডেটার অগ্রাধিকার পায়।

রিটার্ন মান : ( String , Number , Null ) - এই RuleDataSnapshot- এ ডেটার অগ্রাধিকার৷

এই উদাহরণটি নিশ্চিত করে যে নতুন ডেটা লেখা হচ্ছে একটি অগ্রাধিকার

".validate": "newData.getPriority() != null"

সংখ্যা()

এই RuleDataSnapshot- এ একটি সাংখ্যিক মান থাকলে সত্য দেখায়।

রিটার্ন মান : Boolean - true যদি ডেটা সংখ্যাসূচক হয়; অন্যথায় false

এই উদাহরণটি নিশ্চিত করে যে নতুন ডেটা লেখা হচ্ছে একটি সংখ্যাসূচক মান সহ চাইল্ড "বয়স" আছে৷

".validate": "newData.child('age').isNumber()"

isString()

এই RuleDataSnapshot- এ একটি স্ট্রিং মান থাকলে সত্য ফেরত দেয়।

রিটার্ন মান : Boolean - true যদি ডেটা একটি String হয়; অন্যথায় false

এই উদাহরণটি নিশ্চিত করে যে নতুন ডেটা লেখা হচ্ছে একটি স্ট্রিং মান সহ চাইল্ড "নাম" আছে।

".validate": "newData.child('name').isString()

isBoolan()

যদি এই RuleDataSnapshot-এ একটি বুলিয়ান মান থাকে তাহলে সত্য দেখায়।

রিটার্ন মান : Boolean - true যদি ডেটা Boolean হয়; অন্যথায় false

এই উদাহরণটি নিশ্চিত করে যে নতুন ডেটা লেখা হচ্ছে একটি বুলিয়ান মান সহ চাইল্ড "সক্রিয়" আছে।

".validate": "newData.child('active').isBoolean()"

স্ট্রিং: বৈশিষ্ট্য

দৈর্ঘ্য

স্ট্রিং এর দৈর্ঘ্য প্রদান করে।

রিটার্ন মান : Number - স্ট্রিং-এ অক্ষরের সংখ্যা।

এই উদাহরণের জন্য স্ট্রিংটি কমপক্ষে 10টি অক্ষর হতে হবে।

".validate": "newData.isString() && newData.val().length >= 10"

স্ট্রিং: পদ্ধতি

রয়েছে(সাবস্ট্রিং)

যদি স্ট্রিংটিতে নির্দিষ্ট সাবস্ট্রিং থাকে তাহলে সত্য দেখায়।

আর্গুমেন্টস : substring String - একটি সাবস্ট্রিং খোঁজার জন্য।

রিটার্ন মান : Boolean - true যদি স্ট্রিংটিতে নির্দিষ্ট সাবস্ট্রিং থাকে; অন্যথায় false

এই উদাহরণের জন্য ডেটা প্রয়োজন "@" ধারণকারী একটি স্ট্রিং হতে হবে।

".validate": "newData.isString() && newData.val().contains('@')"

দিয়ে শুরু হয়(সাবস্ট্রিং)

স্ট্রিংটি নির্দিষ্ট সাবস্ট্রিং দিয়ে শুরু হলে সত্য দেখায়।

আর্গুমেন্ট : substring String - শুরুতে দেখার জন্য একটি সাবস্ট্রিং।

রিটার্ন মান : Boolean - true যদি স্ট্রিংটিতে নির্দিষ্ট সাবস্ট্রিং থাকে; অন্যথায় false

এই উদাহরণটি পড়ার অ্যাক্সেসের অনুমতি দেয় যদি auth.token.identifier "অভ্যন্তরীণ-" দিয়ে শুরু হয়

".read": "auth.token.identifier.beginsWith('internal-')"

এর সাথে শেষ হয়(সাবস্ট্রিং)

নির্দিষ্ট সাবস্ট্রিং দিয়ে স্ট্রিং শেষ হলে সত্য দেখায়।

আর্গুমেন্টস : substring String - শেষে দেখার জন্য একটি সাবস্ট্রিং।

রিটার্ন মান : Boolean - true যদি নির্দিষ্ট সাবস্ট্রিং দিয়ে স্ট্রিং শেষ হয়; অন্যথায় false

এই উদাহরণটি পড়ার অ্যাক্সেসের অনুমতি দেয় যদি auth.token.identifier "@company.com" দিয়ে শেষ হয়

".read": "auth.token.identifier.endsWith('@company.com')"

প্রতিস্থাপন (সাবস্ট্রিং, প্রতিস্থাপন)

নির্দিষ্ট প্রতিস্থাপন স্ট্রিং দ্বারা প্রতিস্থাপিত একটি নির্দিষ্ট সাবস্ট্রিংয়ের সমস্ত দৃষ্টান্ত সহ স্ট্রিংয়ের একটি অনুলিপি প্রদান করে।

আর্গুমেন্টস : substring String - একটি সাবস্ট্রিং খোঁজার জন্য। replacement String - সাবস্ট্রিং প্রতিস্থাপন করার জন্য একটি স্ট্রিং।

রিটার্ন ভ্যালু : String - সাবস্ট্রিং প্রতিস্থাপনের পর নতুন স্ট্রিং।

replace() পদ্ধতিটি জাভাস্ক্রিপ্ট replace() পদ্ধতির থেকে কিছুটা আলাদা যে এটি একটি নির্দিষ্ট সাবস্ট্রিং এর সমস্ত দৃষ্টান্তকে নির্দিষ্ট প্রতিস্থাপন স্ট্রিং দিয়ে প্রতিস্থাপন করে, শুধুমাত্র প্রথম উদাহরণ নয়।

যেহেতু কীগুলিতে পিরিয়ড অনুমোদিত নয়, সেগুলি সংরক্ষণ করার আগে আমাদের পিরিয়ড সহ স্ট্রিংগুলিকে এড়িয়ে যেতে হবে। এর একটি উদাহরণ ইমেল ঠিকানাগুলির সাথে হবে। অনুমান করুন আমাদের /whitelist/ নোডে সাদা তালিকাভুক্ত ইমেল ঠিকানাগুলির একটি তালিকা ছিল:

{
 "user": {
   "$uid": {
     "email": <email>
   }
 },
 "whitelist": {
   "fred@gmail%2Ecom": true,
   "barney@aol%2Ecom": true
 }
}

আমরা একটি নিয়ম তৈরি করতে পারি যা শুধুমাত্র ব্যবহারকারীদের যোগ করার অনুমতি দেয় যদি তাদের ইমেল /whitelist/ নোডে থাকে:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "true",
        ".write": "root.child('whitelist').child(newData.child('email').val().replace('.', '%2E')).exists()"
      }
    }
  }
}

toLowerCase()

ছোট হাতের অক্ষরে রূপান্তরিত স্ট্রিংয়ের একটি অনুলিপি প্রদান করে।

রিটার্ন মান : String - স্ট্রিংটি ছোট হাতের অক্ষরে রূপান্তরিত হয়।

এই উদাহরণটি পড়ার অ্যাক্সেসের অনুমতি দেয় যদি auth.token.identifier হিসাবে সমস্ত ছোট হাতের /users এর অধীনে বিদ্যমান থাকে।

".read": "root.child('users').child(auth.token.identifier.toLowerCase()).exists()"

টু আপপারকেস()

বড় অক্ষরে রূপান্তরিত স্ট্রিংয়ের একটি অনুলিপি প্রদান করে।

রিটার্ন মান : String - স্ট্রিংটি বড় হাতের অক্ষরে রূপান্তরিত হয়।

এই উদাহরণটি পড়ার অ্যাক্সেসের অনুমতি দেয় যদি auth.token.identifier সমস্ত বড় হাতের অক্ষর /users অধীনে বিদ্যমান থাকে।

".read": "root.child('users').child(auth.token.identifier.toUpperCase()).exists()"

মিল (regex)

স্ট্রিং যদি নির্দিষ্ট রেগুলার এক্সপ্রেশন লিটারেলের সাথে মেলে তাহলে সত্য দেখায়।

রিটার্ন মান : Boolean - true যদি স্ট্রিংটি রেগুলার এক্সপ্রেশন লিটারাল, রেজেক্সের সাথে মেলে; অন্যথায় false

সম্পূর্ণ নিয়ম regex ডকুমেন্টেশন দেখুন।

অপারেটর

+ (যোগ করুন)

ভেরিয়েবল যোগ করতে বা স্ট্রিং কনক্যাটেনেশনের জন্য ব্যবহৃত হয়।

নিম্নলিখিত উদাহরণটি নিশ্চিত করে যে নতুন মানটি বিদ্যমান মানটিকে ঠিক এক দ্বারা বৃদ্ধি করে। এটি একটি কাউন্টার বাস্তবায়নের জন্য দরকারী:

".write": "newData.val() === data.val() + 1"
".validate": "root.child('room_names/' + $room_id).exists()"

- (নেগেট বা বিয়োগ)

একটি মানকে অস্বীকার করতে বা নিয়মের অভিব্যক্তিতে দুটি মান বিয়োগ করতে ব্যবহৃত হয়।

এই বৈধতা নিয়মটি পরীক্ষা করে যে নতুন মানটি অবস্থানের একটি চাইল্ড মানের বিপরীত:

".validate": "newData.val() === -(data.child('quantity').val())"

শুধুমাত্র শেষ দশ মিনিটের বার্তাগুলি পড়তে পারে তা নিশ্চিত করতে নিম্নলিখিত উদাহরণটি বিয়োগ ব্যবহার করে:

".read": "newData.child('timestamp').val() > (now - 600000)"

* (গুণ)

একটি নিয়ম অভিব্যক্তিতে ভেরিয়েবল গুন করতে ব্যবহৃত হয়।

এই বৈধতা নিয়মটি নতুন মানটি মূল্য এবং পরিমাণের (দুটি বিদ্যমান মান):

".validate": "newData.val() === data.child('price').val() * data.child('quantity').val()"

/ (বিভক্ত করা)

একটি নিয়ম অভিব্যক্তিতে ভেরিয়েবলকে ভাগ করতে ব্যবহৃত হয়।

নিম্নলিখিত উদাহরণে, যাচাইকরণ নিয়মটি নিশ্চিত করে যে সংরক্ষিত ডেটা অন্য কোথাও সংরক্ষিত মোট ডেটার গড়:

".validate": "newData.val() === data.parent().child('sum').val() / data.parent().child('numItems').val()"

% (মডুলাস)

একটি নিয়মের অভিব্যক্তিতে একটি চলককে আরেকটি দিয়ে ভাগ করার অবশিষ্টাংশ খুঁজে বের করতে ব্যবহৃত হয়।

এই নিয়মটি যাচাই করে যে শুধুমাত্র জোড় সংখ্যা লেখা যেতে পারে:

".validate": "newData.val() % 2 === 0"

=== (সমান)

একটি রুলস এক্সপ্রেশনে দুটি ভেরিয়েবলের ধরন এবং মান একই আছে কিনা তা পরীক্ষা করতে ব্যবহৃত হয়।

নিম্নলিখিত নিয়মটি শুধুমাত্র ব্যবহারকারীর অ্যাকাউন্টের মালিককে লেখার অ্যাক্সেস দেওয়ার জন্য === অপারেটর ব্যবহার করে। নিয়মটিকে সত্যে মূল্যায়ন করার জন্য ব্যবহারকারীর uid অবশ্যই কী ( $user_id ) এর সাথে হুবহু মেলে।

"users": {
  ".write": "$user_id === auth.uid"
}

!== (সমান নয়)

একটি নিয়ম অভিব্যক্তিতে দুটি ভেরিয়েবল সমান নয় কিনা তা পরীক্ষা করতে ব্যবহৃত হয়।

নিম্নলিখিত পড়ার নিয়ম নিশ্চিত করে যে শুধুমাত্র লগ ইন করা ব্যবহারকারীরা ডেটা পড়তে পারে:

".read": "auth !== null"

&& (এবং)

উভয় অপারেন্ড সত্য হলে সত্যে মূল্যায়ন করে। একটি নিয়ম অভিব্যক্তিতে একাধিক শর্ত মূল্যায়ন করতে ব্যবহৃত হয়।

নিম্নলিখিত বৈধতা নিয়ম চেক করে যে নতুন ডেটা 100 অক্ষরের কম একটি স্ট্রিং:

".validate": "newData.isString() && newData.val().length < 100"

|| (বা)

রুল এক্সপ্রেশনে একটি অপারেন্ড সত্য হলে সত্যে মূল্যায়ন করে।

এই উদাহরণে, আমরা লিখতে পারি যতক্ষণ না পুরানো ডেটা বা নতুন ডেটা বিদ্যমান না থাকে। অন্য কথায়, আমরা লিখতে পারি যদি আমরা ডেটা মুছে ফেলছি বা তৈরি করছি, কিন্তু ডেটা আপডেট করছি না।

".write": "!data.exists() || !newData.exists()"

! (না)

এর একক অপারেন্ড মিথ্যা হলে সত্যে মূল্যায়ন করে। নিয়ম অভিব্যক্তিতে,! অপারেটর প্রায়শই একটি অবস্থানে ডেটা লেখা হয়েছে কিনা তা দেখতে ব্যবহৃত হয়।

নিম্নলিখিত নিয়ম শুধুমাত্র লিখিত অ্যাক্সেসের অনুমতি দেয় যদি নির্দিষ্ট স্থানে কোন ডেটা না থাকে:

".write": "!data.exists()"

> (এর চেয়ে বড়)

একটি নিয়মের অভিব্যক্তিতে একটি মান অন্য মানের থেকে বড় কিনা তা পরীক্ষা করতে ব্যবহৃত হয়।

এই বৈধতা নিয়মটি পরীক্ষা করে যে স্ট্রিংটি লেখা হচ্ছে একটি খালি স্ট্রিং নয়:

".validate": "newData.isString() && newData.val().length > 0"

< (এর চেয়ে কম)

একটি নিয়মের অভিব্যক্তিতে একটি মান অন্য মানের চেয়ে কম কিনা তা পরীক্ষা করতে ব্যবহৃত হয়।

এই বৈধতা নিয়ম চেক করে যে একটি স্ট্রিং 20 অক্ষরের কম:

".validate": "newData.isString() && newData.val().length < 20"

>= (এর চেয়ে বড় বা সমান)

একটি নিয়মের অভিব্যক্তিতে একটি মান অন্য মানের চেয়ে বড় বা সমান কিনা তা পরীক্ষা করতে ব্যবহৃত হয়।

এই বৈধতা নিয়মটি পরীক্ষা করে যে স্ট্রিংটি লেখা হচ্ছে একটি খালি স্ট্রিং নয়:

".validate": "newData.isString() && newData.val().length >= 1"

<= (এর চেয়ে কম বা সমান)

একটি নিয়মের অভিব্যক্তিতে একটি মান অন্য মানের থেকে কম বা সমান কিনা তা পরীক্ষা করতে ব্যবহৃত হয়।

এই বৈধতা নিয়ম নিশ্চিত করে যে ভবিষ্যতে নতুন ডেটা যোগ করা যাবে না:

".validate": "newData.val() <= now"

? (টার্নারি অপারেটর)

একটি শর্তাধীন নিয়ম অভিব্যক্তি মূল্যায়ন ব্যবহৃত.

টারনারি অপারেটর তিনটি অপারেন্ড নেয়। অপারেন্ড আগে? শর্ত হল শর্তটি সত্যে মূল্যায়ন করলে, দ্বিতীয় অপারেন্ডটি মূল্যায়ন করা হয়। শর্ত মিথ্যা হলে, তৃতীয় অপারেন্ড মূল্যায়ন করা হয়।

নিম্নলিখিত বৈধকরণ নিয়মের জন্য, নতুন মান একটি সংখ্যা বা একটি বুলিয়ান হতে পারে। যদি এটি একটি সংখ্যা হয়, এটি অবশ্যই 0 এর থেকে বেশি হতে হবে।

".validate": "newData.isNumber() ? newData.val() > 0 : newData.isBoolean()"