واجهة برمجة تطبيقات قواعد أمان قاعدة بيانات Firebase

القاعدة: الأنواع

.يقرأ

يمنح العميل حق الوصول للقراءة إلى موقع قاعدة بيانات Firebase Realtime.

قاعدة .read هي نوع من قواعد الأمان التي تمنح العميل حق الوصول للقراءة إلى موقع قاعدة بيانات Firebase Realtime. على سبيل المثال:

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

قيمة قاعدة .read هي سلسلة يتم تقييمها كمجموعة فرعية من بناء جملة تعبير JavaScript مع بعض التغييرات السلوكية لزيادة الوضوح والصحة. قاعدة .read التي تمنح الإذن بقراءة موقع ما ستسمح أيضًا بقراءة أي فروع لهذا الموقع، حتى لو كان لدى الفروع قواعد .read الخاصة بها والتي تفشل.

تتمتع قاعدة .read بإمكانية الوصول إلى جميع متغيرات قواعد قاعدة بيانات Firebase Realtime باستثناء newData .

.يكتب

يمنح العميل حق الوصول للكتابة إلى موقع قاعدة بيانات Firebase Realtime.

قاعدة .write هي نوع من قواعد الأمان التي تمنح العميل حق الوصول للكتابة إلى موقع قاعدة بيانات Firebase Realtime. على سبيل المثال:

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

قيمة قاعدة .write عبارة عن سلسلة، يتم تقييمها كمجموعة فرعية من بناء جملة تعبير JavaScript مع بعض التغييرات السلوكية لزيادة الوضوح والصحة. قاعدة .write التي تمنح الإذن بالكتابة إلى موقع ما ستسمح أيضًا بالكتابة لأي فرع من ذلك الموقع، حتى لو كان لدى الفروع قواعد .write الخاصة بها والتي تفشل.

تتمتع قاعدة .write بإمكانية الوصول إلى جميع متغيرات قواعد قاعدة بيانات Firebase Realtime.

.التحقق من صحة

يتم استخدامه بمجرد منح قاعدة .write حق الوصول، للتأكد من أن البيانات التي تتم كتابتها تتوافق مع مخطط محدد.

يتم استخدام قاعدة .validate بمجرد منح قاعدة .write حق الوصول، للتأكد من أن البيانات التي تتم كتابتها تتوافق مع معيار محدد. بالإضافة إلى منح حق الوصول إلى .write ، يجب أن تنجح جميع قواعد .validate ذات الصلة قبل السماح بالكتابة. على سبيل المثال:

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

قيمة قاعدة .validate عبارة عن سلسلة، يتم تقييمها كمجموعة فرعية من بناء جملة تعبير JavaScript مع بعض التغييرات السلوكية لزيادة الوضوح والصحة.

تتمتع قاعدة .validate بإمكانية الوصول إلى جميع متغيرات القواعد في قاعدة بيانات Firebase Realtime.

.indexOn

يعمل على تحسين أداء الاستعلام عن طريق إخبار قاعدة بيانات Firebase Realtime بالمفاتيح التي تريد فهرسة بياناتك.

تخبر قاعدة .indexOn خوادم قاعدة بيانات Firebase Realtime بفهرسة مفاتيح محددة في بياناتك لتحسين أداء استعلاماتك. على سبيل المثال، بالنظر إلى قاعدة بيانات تحتوي على مجموعة من بيانات الديناصورات، يمكننا إخبار Firebase Realtime Database بتحسين الاستعلامات، قبل أن يتم إرجاعها من الخوادم، عن طريق إضافة هذه القاعدة:

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

يمكنك معرفة المزيد من المعلومات حول قاعدة .indexOn من خلال الرجوع إلى قسم دليل الأمان الخاص بفهرسة بياناتك .

القاعدة: المتغيرات

مصادقة

متغير يحتوي على حمولة الرمز المميز إذا تمت مصادقة العميل، أو null إذا لم تتم مصادقة العميل.

تتيح لك قاعدة بيانات Firebase Realtime إمكانية المصادقة بسهولة مع العديد من موفري الخدمة المضمنين وستقوم بإنشاء رموز مصادقة مميزة لهم. بعد مصادقة المستخدم مع أحد الموفرين المضمنين، سيحتوي متغير المصادقة على ما يلي:

مجال وصف
provider طريقة المصادقة المستخدمة (على سبيل المثال "كلمة المرور" أو "مجهول" أو "facebook" أو "github" أو "google" أو "twitter").
uid معرف مستخدم فريد، مضمون أن يكون فريدًا عبر جميع مقدمي الخدمة.
token محتويات رمز معرف مصادقة Firebase. راجع 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 أيضًا على أي مطالبات مخصصة يحددها المطور.

يمكن استخدام كل هذه القيم ضمن القواعد. على سبيل المثال، لتقييد الوصول إلى حسابات Google المرتبطة بعنوان gmail.com، يمكننا إضافة القاعدة:

{
  "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".

الآن

يحتوي على عدد المللي ثانية منذ عصر Unix وفقًا لخوادم قاعدة بيانات Firebase Realtime.

يحتوي المتغير now على عدد المللي ثانية منذ عصر UNIX وفقًا لخوادم قاعدة بيانات Firebase Realtime. على سبيل المثال، يمكنك استخدام هذا للتحقق من أن الوقت الذي created المستخدم لم يتم تعيينه مطلقًا على وقت في المستقبل:

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

جذر

RuleDataSnapshot المطابق للبيانات الحالية في جذر قاعدة بيانات Firebase Realtime الخاصة بك.

يمنحك المتغير الجذر RuleDataSnapshot المطابق للبيانات الحالية في جذر قاعدة بيانات Firebase Realtime. يمكنك استخدام هذا لقراءة أي بيانات في قاعدة البيانات الخاصة بك في تعبيرات القاعدة الخاصة بك. على سبيل المثال، إذا أردنا السماح للمستخدمين بقراءة /comments فقط إذا تم ضبط /users/<id>/active على القيمة true، فيمكننا استخدام:

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

وبعد ذلك، إذا احتوى /users/barney/active على القيمة true، فيمكن للمستخدم الذي تمت مصادقته باستخدام معرف المستخدم "barney" الكتابة إلى عقدة /comments .

بيانات

RuleDataSnapshot المطابق للبيانات الحالية في قاعدة بيانات Firebase Realtime في موقع القاعدة التي يتم تنفيذها حاليًا.

يمنحك متغير البيانات RuleDataSnapshot المطابق للبيانات الحالية في موقع قاعدة البيانات للقاعدة المنفذة حاليًا (على عكس الجذر، الذي يمنحك البيانات الخاصة بجذر قاعدة البيانات الخاصة بك).

على سبيل المثال، إذا أردت السماح لأي عميل بالوصول إلى /users/<user> إذا تم ضبط /users/<user>/public على true، فيمكنك استخدام:

{
  "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();

المتغير newData غير متوفر في قواعد .read نظرًا لعدم وجود بيانات جديدة قيد الكتابة. يجب عليك فقط استخدام البيانات .

RuleDataSnapshot: الأساليب

فال ()

يحصل على القيمة الأولية ( string أو number أو boolean أو null ) من RuleDataSnapshot .

قيمة الإرجاع : ( String ، Number ، Boolean ، Null ) - القيمة الأولية من RuleDataSnapshot .

على عكس DataSnapshot.val() ‎، فإن استدعاء val() على RuleDataSnapshot الذي يحتوي على بيانات فرعية لن يُرجع كائنًا يحتوي على العناصر الفرعية. وبدلاً من ذلك ستُرجع قيمة خافرة خاصة. وهذا يضمن أن القواعد يمكن أن تعمل دائمًا بكفاءة عالية.

ونتيجة لذلك، يجب عليك دائمًا استخدام child() للوصول إلى الأطفال (على سبيل المثال data.child('name').val() ، وليس data.val().name ).

يسمح هذا المثال بالقراءة فقط إذا تم ضبط التابع isReadable على true في الموقع الذي تتم قراءته.

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

طفل()

يحصل على RuleDataSnapshot للموقع على المسار النسبي المحدد.

الوسائط : String childPath - مسار نسبي لموقع بيانات الطفل.

قيمة الإرجاع : RuleDataSnapshot - RuleDataSnapshot للموقع الفرعي.

يمكن أن يكون المسار النسبي إما اسمًا فرعيًا بسيطًا (على سبيل المثال 'fred') أو مسارًا أعمق مفصولاً بشرطة مائلة (على سبيل المثال 'fred/name/first'). إذا لم يكن الموقع الفرعي يحتوي على بيانات، فسيتم إرجاع RuleDataSnapshot فارغًا.

يسمح هذا المثال بالقراءة فقط إذا تم ضبط التابع isReadable على true في الموقع الذي تتم قراءته.

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

الأبوين()

يحصل على RuleDataSnapshot للموقع الأصلي.

قيمة الإرجاع : RuleDataSnapshot - RuleDataSnapshot للموقع الأصلي.

إذا كان هذا المثيل يشير إلى جذر قاعدة بيانات Firebase Realtime الخاصة بك، فلن يكون له أصل، وسيفشل parent() ، مما يتسبب في تخطي تعبير القاعدة الحالي (كفشل).

يسمح هذا المثال بالقراءة فقط إذا تم ضبط الخيار isReadable على القيمة true.

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

هاتشايلد (مسار الطفل)

يُرجع صحيحًا في حالة وجود الطفل المحدد.

الوسائط : String childPath - مسار نسبي لموقع الطفل المحتمل.

قيمة الإرجاع : منطقية - true إذا كانت البيانات موجودة في المسار الفرعي المحدد؛ آخر false .

يسمح هذا المثال بكتابة البيانات فقط إذا كانت تحتوي على "اسم" فرعي.

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

أطفال([أطفال])

التحقق من وجود الأطفال.

الوسائط : Array children اختيارية - مصفوفة من المفاتيح الفرعية التي يجب أن تكون جميعها موجودة.

قيمة الإرجاع : 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()"

سلسلة ()

يُرجع صحيحًا إذا كانت RuleDataSnapshot تحتوي على قيمة سلسلة.

قيمة الإرجاع : Boolean - true إذا كانت البيانات عبارة عن String ؛ آخر false .

يضمن هذا المثال أن البيانات الجديدة التي تتم كتابتها لها "اسم" فرعي بقيمة سلسلة.

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

isBoolean()

يُرجع صحيحًا إذا كانت RuleDataSnapshot تحتوي على قيمة منطقية.

قيمة الإرجاع : Boolean - true إذا كانت البيانات Boolean ؛ آخر false .

يضمن هذا المثال أن البيانات الجديدة التي تتم كتابتها تحتوي على بيانات فرعية "نشطة" بقيمة منطقية.

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

السلسلة: خصائص

طول

إرجاع طول السلسلة.

قيمة الإرجاع : Number - عدد الأحرف في السلسلة.

يتطلب هذا المثال أن تتكون السلسلة من 10 أحرف على الأقل.

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

سلسلة: طرق

يحتوي على (سلسلة فرعية)

يُرجع صحيحًا إذا كانت السلسلة تحتوي على السلسلة الفرعية المحددة.

الوسائط : String substring - سلسلة فرعية للبحث عنها.

قيمة الإرجاع : Boolean - true إذا كانت السلسلة تحتوي على السلسلة الفرعية المحددة؛ آخر false .

يتطلب هذا المثال أن تكون البيانات عبارة عن سلسلة تحتوي على "@".

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

يبدأ بـ (سلسلة فرعية)

يُرجع صحيحًا إذا كانت السلسلة تبدأ بالسلسلة الفرعية المحددة.

الوسائط : String substring - سلسلة فرعية يجب البحث عنها في البداية.

قيمة الإرجاع : Boolean - true إذا كانت السلسلة تحتوي على السلسلة الفرعية المحددة؛ آخر false .

يسمح هذا المثال بالوصول للقراءة إذا كان auth.token.identifier يبدأ بـ "internal-"

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

ينتهي مع (سلسلة فرعية)

يُرجع صحيحًا إذا انتهت السلسلة بالسلسلة الفرعية المحددة.

الوسائط : String substring - سلسلة فرعية يجب البحث عنها في النهاية.

قيمة الإرجاع : 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()"

التطابقات (التعبير العادي)

يُرجع صحيحًا إذا تطابقت السلسلة مع التعبير العادي المحدد.

قيمة الإرجاع : Boolean - true إذا كانت السلسلة تطابق التعبير العادي الحرفي، regex؛ آخر 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"

=== (يساوي)

يستخدم للتحقق مما إذا كان هناك متغيرين في تعبير القواعد لهما نفس النوع والقيمة.

تستخدم القاعدة التالية عامل التشغيل === لمنح حق الوصول للكتابة فقط لمالك حساب المستخدم. يجب أن يتطابق معرف المستخدم الخاص بالمستخدم تمامًا مع المفتاح ( $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()"