Catch up on everthing we announced at this year's Firebase Summit. Learn more

রিয়েলটাইম ডেটাবেস বিধিগুলিতে শর্তাদি ব্যবহার করুন

এই নির্দেশিকাটি উপর তৈরী করে কোর Firebase সিকিউরিটি রুলস ভাষা শিখতে আপনার Firebase রিয়েলটাইম ডাটাবেস সিকিউরিটি রুলস শর্ত যোগ করার জন্য কিভাবে দেখানোর জন্য গাইড।

রিয়েলটাইম ডাটাবেস সিকিউরিটি রুলস প্রাথমিক বিল্ডিং ব্লক অবস্থা। একটি শর্ত হল একটি বুলিয়ান অভিব্যক্তি যা নির্ধারণ করে যে একটি নির্দিষ্ট অপারেশন অনুমোদিত বা অস্বীকার করা উচিত। সাধারণ নিয়ম জন্য ব্যবহার true এবং false অবস্থা লিটারেল prefectly ভাল কাজ করে। কিন্তু রিয়েলটাইম ডেটাবেস সিকিউরিটি রুলস ল্যাঙ্গুয়েজ আপনাকে আরও জটিল শর্ত লিখতে পারে যা করতে পারে:

  • ব্যবহারকারীর প্রমাণীকরণ পরীক্ষা করুন
  • নতুন জমা দেওয়া ডেটার বিপরীতে বিদ্যমান ডেটা মূল্যায়ন করুন
  • আপনার ডাটাবেসের বিভিন্ন অংশ অ্যাক্সেস করুন এবং তুলনা করুন
  • ইনকামিং ডেটা যাচাই করুন
  • নিরাপত্তা যুক্তির জন্য ইনকামিং প্রশ্নের গঠন ব্যবহার করুন

পাথ সেগমেন্ট ক্যাপচার করতে $ ভেরিয়েবল ব্যবহার করে

আপনার সাথে ক্যাপচার ভেরিয়েবল ঘোষণা করে একটি পড়তে বা লিখতে জন্য পথের অংশ ক্যাপচার করতে পারেন $ উপসর্গ। এটি একটি ওয়াইল্ড কার্ড হিসাবে কাজ করে এবং নিয়মের শর্তগুলির মধ্যে ব্যবহারের জন্য সেই কীটির মান সংরক্ষণ করে:

{
  "rules": {
    "rooms": {
      // this rule applies to any child of /rooms/, the key for each room id
      // is stored inside $room_id variable for reference
      "$room_id": {
        "topic": {
          // the room's topic can be changed if the room id has "public" in it
          ".write": "$room_id.contains('public')"
        }
      }
    }
  }
}

গতিশীল $ ভেরিয়েবল এছাড়াও ধ্রুবক পথ নামের সাথে সমান্তরাল ভাবে ব্যবহার করা যাবে। এই উদাহরণে, আমরা ব্যবহার করছি $other একটি ডিক্লেয়ার পরিবর্তনশীল .validate নিয়ম যে নিশ্চিত করে যে widget ছাড়া অন্য কোন সন্তান নেই title এবং color । যেকোন লেখার ফলে অতিরিক্ত সন্তান তৈরি হবে তা ব্যর্থ হবে।

{
  "rules": {
    "widget": {
      // a widget can have a title or color attribute
      "title": { ".validate": true },
      "color": { ".validate": true },

      // but no other child paths are allowed
      // in this case, $other means any key excluding "title" and "color"
      "$other": { ".validate": false }
    }
  }
}

প্রমাণীকরণ

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

আপনার অ্যাপ Firebase প্রমাণীকরণ ব্যবহার করে থাকেন, তাহলে request.auth পরিবর্তনশীল ক্লায়েন্ট তথ্য অনুরোধ জন্য প্রমাণীকরণ তথ্য উপস্থিত রয়েছে। সম্পর্কে আরও তথ্যের জন্য request.auth দেখুন রেফারেন্স ডকুমেন্টেশন

Firebase প্রমাণীকরণ Firebase রিয়েলটাইম ডেটাবেসের সাথে একীভূত হয় যাতে আপনি শর্তগুলি ব্যবহার করে প্রতি-ব্যবহারকারীর ভিত্তিতে ডেটা অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন। একবার একটি ব্যবহারকারী পরিচয় প্রমাণিত auth আপনার রিয়েলটাইম ডাটাবেস সিকিউরিটি রুলস নিয়ম পরিবর্তনশীল ব্যবহারকারীর তথ্য সহ জনবহুল করা হবে না। এই তথ্যটি তাদের অনন্য শনাক্তকারী (অন্তর্ভুক্ত uid ) পাশাপাশি এই ধরনের একটি ফেসবুক আইডি বা ইমেল ঠিকানা এবং অন্যান্য তথ্যের এভাবে সংযোগ অ্যাকাউন্ট ডেটা। আপনি যদি একটি কাস্টম প্রমাণীকরণ প্রদানকারী বাস্তবায়ন করেন, আপনি আপনার ব্যবহারকারীর প্রমাণীকরণ পেলোডে আপনার নিজস্ব ক্ষেত্রগুলি যোগ করতে পারেন৷

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

auth চলক

পূর্বনির্ধারিত auth নিয়ম পরিবর্তনশীল নাল আগে প্রমাণীকরণ সঞ্চালিত হয়।

একবার একটি ব্যবহারকারীর সঙ্গে অনুমোদন যাচাই করা হয় Firebase প্রমাণীকরণ নিম্নোক্ত গুণাবলী থাকতে হবে:

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

এখানে একটি উদাহরণ নিয়ম ব্যবহার করে করা হয় auth পরিবর্তনশীল তা নিশ্চিত করার জন্য প্রত্যেক ব্যবহারকারীর শুধুমাত্র একটি ব্যবহারকারী-নির্দিষ্ট পাথ লিখতে পারেন:

{
  "rules": {
    "users": {
      "$user_id": {
        // grants write access to the owner of this user account
        // whose uid must exactly match the key ($user_id)
        ".write": "$user_id === auth.uid"
      }
    }
  }
}

প্রমাণীকরণ শর্ত সমর্থন করার জন্য আপনার ডাটাবেস গঠন

এটি সাধারণত আপনার ডাটাবেসকে এমনভাবে গঠন করা সহায়ক যা নিয়ম লেখা সহজ করে তোলে। রিয়েলটাইম ডেটাবেসে ব্যবহারকারী ডেটা সঞ্চয় করার জন্য এক সাধারণ প্যাটার্ন একটি একক আপনার সকল ব্যবহারকারীকে সঞ্চয় করতে হয় users নোড যার সন্তান uid প্রত্যেক ব্যবহারকারীর জন্য মান। আপনি যদি এই ডেটাতে অ্যাক্সেস সীমাবদ্ধ করতে চান যাতে শুধুমাত্র লগ-ইন করা ব্যবহারকারীরা তাদের নিজস্ব ডেটা দেখতে পারে, আপনার নিয়মগুলি এরকম কিছু দেখাবে৷

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "auth != null && auth.uid == $uid"
      }
    }
  }
}

প্রমাণীকরণ কাস্টম দাবি নিয়ে কাজ করা

যে বিভিন্ন ব্যবহারকারীদের জন্য কাস্টম প্রবেশাধিকার নিয়ন্ত্রণ প্রয়োজন অ্যাপ্লিকেশনগুলির জন্য, Firebase প্রমাণীকরণের সাথে ডেভেলপারদের পারবেন একটি Firebase ব্যবহারকারী সেট দাবী । এই দাবির মধ্যে accesible হয় auth.token আপনার নিয়ম পরিবর্তনশীল। এখানে বিধি জারি করে যে ব্যবহার করতে একটি উদাহরণ hasEmergencyTowel কাস্টম দাবি:

{
  "rules": {
    "frood": {
      // A towel is about the most massively useful thing an interstellar
      // hitchhiker can have
      ".read": "auth.token.hasEmergencyTowel === true"
    }
  }
}

তৈরি ডেভেলপারগণ তাদের নিজস্ব প্রমাণীকরণের টোকেনগুলি ঐচ্ছিকভাবে এই টোকেন দাবি যোগ করতে পারেন। এই দাবির উপর avaialble হয় auth.token আপনার নিয়ম পরিবর্তনশীল।

বিদ্যমান ডেটা বনাম নতুন ডেটা

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

ব্যাখ্যা করার জন্য, এই নিয়মটি আমাদের নতুন রেকর্ড তৈরি করতে বা বিদ্যমানগুলি মুছতে দেয়, কিন্তু বিদ্যমান নন-নাল ডেটাতে পরিবর্তন করতে দেয় না:

// we can write as long as old data or new data does not exist
// in other words, if this is a delete or a create, but not an update
".write": "!data.exists() || !newData.exists()"

অন্যান্য পাথে তথ্য উল্লেখ করা

নিয়মের মাপকাঠি হিসেবে যেকোনো তথ্য ব্যবহার করা যেতে পারে। পূর্বনির্ধারিত ভেরিয়েবল ব্যবহার root , data , এবং newData , আমরা কোনো পথ যেমন আগে বা একটি লেখার ঘটনার পরে উপস্থিত হবে অ্যাক্সেস করতে পারেন।

এই উদাহরণে, যা যতদিন লেখার অপারেশন পারবেন বিবেচনা মান হিসাবে /allow_writes/ নোড true , পিতা বা মাতা নোডের একটি নেই readOnly পতাকা সেট, এবং সেখানে একটি শিশু নামে হয় foo সদ্য লিখিত তথ্য:

".write": "root.child('allow_writes').val() === true &&
          !data.parent().child('readOnly').exists() &&
          newData.child('foo').exists()"

তথ্য যাচাই করা হচ্ছে

ডাটা স্ট্রাকচার বলবৎ করিবার এবং বিন্যাস এবং ডেটা ব্যবহার করা উচিত বিষয়বস্তু যাচাই .validate নিয়ম, যার পরে শুধুমাত্র একটি চালানো হয় .write নিয়ম অ্যাক্সেস মঞ্জুর করতে সফল হয়। নীচে একটি নমুনা .validate নিয়ম সংজ্ঞা যা শুধুমাত্র বিন্যাসটি হল YYYY-এম এম-ডিডি বছর 1900-2099 মধ্যে, যা একটি রেগুলার এক্সপ্রেশন ব্যবহার পরীক্ষা করা হয় তারিখ পারেন।

".validate": "newData.isString() &&
              newData.val().matches(/^(19|20)[0-9][0-9][-\\/. ](0[1-9]|1[012])[-\\/. ](0[1-9]|[12][0-9]|3[01])$/)"

.validate নিয়ম নিরাপত্তা শাসনের শুধুমাত্র টাইপ যা ক্যাসকেড না হয়। কোনো শিশুর রেকর্ডে কোনো বৈধতা নিয়ম ব্যর্থ হলে, সম্পূর্ণ লেখার অপারেশন প্রত্যাখ্যান করা হবে। উপরন্তু, বৈধকরণ সংজ্ঞা (যে, যখন নতুন মান লিখিত হচ্ছে উপেক্ষা করা হয় ডেটা মুছে ফেলা হয় null )।

এগুলি তুচ্ছ পয়েন্টের মতো মনে হতে পারে, কিন্তু প্রকৃতপক্ষে শক্তিশালী ফায়ারবেস রিয়েলটাইম ডেটাবেস নিরাপত্তা নিয়ম লেখার জন্য উল্লেখযোগ্য বৈশিষ্ট্য। নিম্নলিখিত নিয়ম বিবেচনা করুন:

{
  "rules": {
    // write is allowed for all paths
    ".write": true,
    "widget": {
      // a valid widget must have attributes "color" and "size"
      // allows deleting widgets (since .validate is not applied to delete rules)
      ".validate": "newData.hasChildren(['color', 'size'])",
      "size": {
        // the value of "size" must be a number between 0 and 99
        ".validate": "newData.isNumber() &&
                      newData.val() >= 0 &&
                      newData.val() <= 99"
      },
      "color": {
        // the value of "color" must exist as a key in our mythical
        // /valid_colors/ index
        ".validate": "root.child('valid_colors/' + newData.val()).exists()"
      }
    }
  }
}

এই বৈকল্পিকটি মাথায় রেখে, নিম্নলিখিত লেখার ক্রিয়াকলাপের ফলাফলগুলি দেখুন:

জাভাস্ক্রিপ্ট
var ref = db.ref("/widget");

// PERMISSION_DENIED: does not have children color and size
ref.set('foo');

// PERMISSION DENIED: does not have child color
ref.set({size: 22});

// PERMISSION_DENIED: size is not a number
ref.set({ size: 'foo', color: 'red' });

// SUCCESS (assuming 'blue' appears in our colors list)
ref.set({ size: 21, color: 'blue'});

// If the record already exists and has a color, this will
// succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
// will fail to validate
ref.child('size').set(99);
উদ্দেশ্য গ
দ্রষ্টব্য: এই Firebase পণ্য অ্যাপ ক্লিপ লক্ষ্যে পাওয়া যায় না।
FIRDatabaseReference *ref = [[[FIRDatabase database] reference] child: @"widget"];

// PERMISSION_DENIED: does not have children color and size
[ref setValue: @"foo"];

// PERMISSION DENIED: does not have child color
[ref setValue: @{ @"size": @"foo" }];

// PERMISSION_DENIED: size is not a number
[ref setValue: @{ @"size": @"foo", @"color": @"red" }];

// SUCCESS (assuming 'blue' appears in our colors list)
[ref setValue: @{ @"size": @21, @"color": @"blue" }];

// If the record already exists and has a color, this will
// succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
// will fail to validate
[[ref child:@"size"] setValue: @99];
সুইফট
দ্রষ্টব্য: এই Firebase পণ্য অ্যাপ ক্লিপ লক্ষ্যে পাওয়া যায় না।
var ref = FIRDatabase.database().reference().child("widget")

// PERMISSION_DENIED: does not have children color and size
ref.setValue("foo")

// PERMISSION DENIED: does not have child color
ref.setValue(["size": "foo"])

// PERMISSION_DENIED: size is not a number
ref.setValue(["size": "foo", "color": "red"])

// SUCCESS (assuming 'blue' appears in our colors list)
ref.setValue(["size": 21, "color": "blue"])

// If the record already exists and has a color, this will
// succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
// will fail to validate
ref.child("size").setValue(99);
জাভা
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("widget");

// PERMISSION_DENIED: does not have children color and size
ref.setValue("foo");

// PERMISSION DENIED: does not have child color
ref.child("size").setValue(22);

// PERMISSION_DENIED: size is not a number
Map<String,Object> map = new HashMap<String, Object>();
map.put("size","foo");
map.put("color","red");
ref.setValue(map);

// SUCCESS (assuming 'blue' appears in our colors list)
map = new HashMap<String, Object>();
map.put("size", 21);
map.put("color","blue");
ref.setValue(map);

// If the record already exists and has a color, this will
// succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
// will fail to validate
ref.child("size").setValue(99);
বিশ্রাম
# PERMISSION_DENIED: does not have children color and size
curl -X PUT -d 'foo' \
https://docs-examples.firebaseio.com/rest/securing-data/example.json

# PERMISSION DENIED: does not have child color
curl -X PUT -d '{"size": 22}' \
https://docs-examples.firebaseio.com/rest/securing-data/example.json

# PERMISSION_DENIED: size is not a number
curl -X PUT -d '{"size": "foo", "color": "red"}' \
https://docs-examples.firebaseio.com/rest/securing-data/example.json

# SUCCESS (assuming 'blue' appears in our colors list)
curl -X PUT -d '{"size": 21, "color": "blue"}' \
https://docs-examples.firebaseio.com/rest/securing-data/example.json

# If the record already exists and has a color, this will
# succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
# will fail to validate
curl -X PUT -d '99' \
https://docs-examples.firebaseio.com/rest/securing-data/example/size.json

এখন একই কাঠামো এ লুক দিন, কিন্তু ব্যবহার .write পরিবর্তে নিয়ম .validate :

{
  "rules": {
    // this variant will NOT allow deleting records (since .write would be disallowed)
    "widget": {
      // a widget must have 'color' and 'size' in order to be written to this path
      ".write": "newData.hasChildren(['color', 'size'])",
      "size": {
        // the value of "size" must be a number between 0 and 99, ONLY IF WE WRITE DIRECTLY TO SIZE
        ".write": "newData.isNumber() && newData.val() >= 0 && newData.val() <= 99"
      },
      "color": {
        // the value of "color" must exist as a key in our mythical valid_colors/ index
        // BUT ONLY IF WE WRITE DIRECTLY TO COLOR
        ".write": "root.child('valid_colors/'+newData.val()).exists()"
      }
    }
  }
}

এই ভেরিয়েন্টে, নিম্নলিখিত যেকোন ক্রিয়াকলাপ সফল হবে:

জাভাস্ক্রিপ্ট
var ref = new Firebase(URL + "/widget");

// ALLOWED? Even though size is invalid, widget has children color and size,
// so write is allowed and the .write rule under color is ignored
ref.set({size: 99999, color: 'red'});

// ALLOWED? Works even if widget does not exist, allowing us to create a widget
// which is invalid and does not have a valid color.
// (allowed by the write rule under "color")
ref.child('size').set(99);
উদ্দেশ্য গ
দ্রষ্টব্য: এই Firebase পণ্য অ্যাপ ক্লিপ লক্ষ্যে পাওয়া যায় না।
Firebase *ref = [[Firebase alloc] initWithUrl:URL];

// ALLOWED? Even though size is invalid, widget has children color and size,
// so write is allowed and the .write rule under color is ignored
[ref setValue: @{ @"size": @9999, @"color": @"red" }];

// ALLOWED? Works even if widget does not exist, allowing us to create a widget
// which is invalid and does not have a valid color.
// (allowed by the write rule under "color")
[[ref childByAppendingPath:@"size"] setValue: @99];
সুইফট
দ্রষ্টব্য: এই Firebase পণ্য অ্যাপ ক্লিপ লক্ষ্যে পাওয়া যায় না।
var ref = Firebase(url:URL)

// ALLOWED? Even though size is invalid, widget has children color and size,
// so write is allowed and the .write rule under color is ignored
ref.setValue(["size": 9999, "color": "red"])

// ALLOWED? Works even if widget does not exist, allowing us to create a widget
// which is invalid and does not have a valid color.
// (allowed by the write rule under "color")
ref.childByAppendingPath("size").setValue(99)
জাভা
Firebase ref = new Firebase(URL + "/widget");

// ALLOWED? Even though size is invalid, widget has children color and size,
// so write is allowed and the .write rule under color is ignored
Map<String,Object> map = new HashMap<String, Object>();
map.put("size", 99999);
map.put("color", "red");
ref.setValue(map);

// ALLOWED? Works even if widget does not exist, allowing us to create a widget
// which is invalid and does not have a valid color.
// (allowed by the write rule under "color")
ref.child("size").setValue(99);
বিশ্রাম
# ALLOWED? Even though size is invalid, widget has children color and size,
# so write is allowed and the .write rule under color is ignored
curl -X PUT -d '{size: 99999, color: "red"}' \
https://docs-examples.firebaseio.com/rest/securing-data/example.json

# ALLOWED? Works even if widget does not exist, allowing us to create a widget
# which is invalid and does not have a valid color.
# (allowed by the write rule under "color")
curl -X PUT -d '99' \
https://docs-examples.firebaseio.com/rest/securing-data/example/size.json

এই মধ্যে পার্থক্য প্রকাশ .write এবং .validate নিয়ম। হিসাবে দেখায়, এই নিয়ম সব ব্যবহার করে লেখা দিতে হবে .validate , সম্ভাব্য ব্যতিক্রম newData.hasChildren() নিয়ম, যার উপর কিনা মুছে দেয়া উচিৎ নির্ভর করবে।

প্রশ্ন ভিত্তিক নিয়ম

যদিও আপনি ফিল্টার যেমন নিয়ম ব্যবহার করতে পারবেন না , আপনি আপনার নিয়ম ক্যোয়ারী পরামিতি ব্যবহার করে ডেটার সাব-সেট নির্বাচন এক্সেস সীমিত করতে পারেন। ব্যবহারের query. ক্যোয়ারী প্যারামিটারের উপর ভিত্তি করে পঠন বা লেখার অ্যাক্সেস মঞ্জুর করতে আপনার নিয়মে অভিব্যক্তি।

উদাহরণস্বরূপ, নিম্নলিখিত প্রশ্নের সাথে ভিত্তিক নিয়ম ব্যবহার ব্যবহারকারী ভিত্তিক নিরাপত্তা নিয়ম ও যেই ক্যোয়ারীর ভিত্তিক নিয়ম ডেটাতে অ্যাক্সেস সীমাবদ্ধ করতে baskets শুধুমাত্র বাজারের ঝুড়ি সক্রিয় ব্যবহারকারী মালিক থেকে সংগ্রহ:

"baskets": {
  ".read": "auth.uid != null &&
            query.orderByChild == 'owner' &&
            query.equalTo == auth.uid" // restrict basket access to owner of basket
}

নিম্নোক্ত ক্যোয়ারী, যার মধ্যে নিয়মের ক্যোয়ারী প্যারামিটার রয়েছে, সফল হবে:

db.ref("baskets").orderByChild("owner")
                 .equalTo(auth.currentUser.uid)
                 .on("value", cb)                 // Would succeed

যাইহোক, প্রশ্ন যা নিয়ম পরামিতি অন্তর্ভুক্ত করবেন না একটি সঙ্গে ব্যর্থ হবে PermissionDenied ত্রুটি:

db.ref("baskets").on("value", cb)                 // Would fail with PermissionDenied

পঠিত ক্রিয়াকলাপগুলির মাধ্যমে একজন ক্লায়েন্ট কত ডেটা ডাউনলোড করবে তা সীমাবদ্ধ করতে আপনি ক্যোয়ারী-ভিত্তিক নিয়মগুলিও ব্যবহার করতে পারেন।

উদাহরণ স্বরূপ, নিম্নোক্ত নিয়মটি অগ্রাধিকার দ্বারা আদেশ অনুসারে একটি প্রশ্নের প্রথম 1000টি ফলাফলে পড়ার অ্যাক্সেসকে সীমাবদ্ধ করে:

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example queries:

db.ref("messages").on("value", cb)                // Would fail with PermissionDenied

db.ref("messages").limitToFirst(1000)
                  .on("value", cb)                // Would succeed (default order by key)

নিম্নলিখিত query. এক্সপ্রেশন রিয়েলটাইম ডাটাবেস নিরাপত্তা নিয়ম উপলব্ধ.

প্রশ্ন-ভিত্তিক নিয়মের অভিব্যক্তি
অভিব্যক্তি টাইপ বর্ণনা
query.orderByKey
query.orderByPriority
query.orderByValue
বুলিয়ান কী, অগ্রাধিকার বা মান দ্বারা আদেশ করা প্রশ্নের জন্য সত্য। অন্যথায় মিথ্যা।
query.orderByChild স্ট্রিং
খালি
একটি চাইল্ড নোডের আপেক্ষিক পথ উপস্থাপন করতে একটি স্ট্রিং ব্যবহার করুন। উদাহরণস্বরূপ, query.orderByChild == "address/zip" । যদি কোয়েরি একটি চাইল্ড নোড দ্বারা আদেশ না করা হয়, তাহলে এই মানটি শূন্য।
query.startAt
query.endAt
query.equalTo
স্ট্রিং
সংখ্যা
বুলিয়ান
খালি
এক্সিকিউটিং কোয়েরির সীমানা পুনরুদ্ধার করে, অথবা কোনো আবদ্ধ সেট না থাকলে শূন্য ফেরত দেয়।
query.limitToFirst
query.limitToLast
সংখ্যা
খালি
এক্সিকিউটিং ক্যোয়ারীতে সীমা পুনরুদ্ধার করে, বা সীমা সেট না থাকলে শূন্য প্রদান করে।

পরবর্তী পদক্ষেপ

শর্তগুলির এই আলোচনার পরে, আপনি নিয়মগুলির আরও পরিশীলিত উপলব্ধি পেয়েছেন এবং এর জন্য প্রস্তুত:

মূল ব্যবহারের ক্ষেত্রে কীভাবে পরিচালনা করতে হয় তা শিখুন এবং নিয়মগুলি তৈরি, পরীক্ষা এবং স্থাপনের জন্য কর্মপ্রবাহ শিখুন:

রিয়েলটাইম ডেটাবেসের জন্য নির্দিষ্ট নিয়ম বৈশিষ্ট্যগুলি জানুন: