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

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

.read

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

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

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

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

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

.write

يمنح العميل إذنًا بالتعديل في موقع "قاعدة بيانات Firebase" في الوقت الفعلي.

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

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

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

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

.Verifyate

تُستخدَم بعد منح إحدى القواعد .write إذن الوصول، وذلك لضمان توافق البيانات التي تتم كتابتها مع مخطّط محدَّد.

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

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

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

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

.indexOn

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

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

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

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

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

المصادقة

متغيّر يحتوي على حمولة البيانات الخاصة بالرمز المميّز في حال تمت مصادقة العميل، أو null في حال لم تتم مصادقة العميل.

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

الحقل الوصف
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'"
    }
  }
}

رمز المصادقة

متغيّر يحتوي على محتوى الرمز المميّز لرقم تعريف مصادقة Firebase.

يحتوي الرمز المميّز على بعض المفاتيح التالية أو جميعها:

الحقل الوصف
email تمثّل هذه السمة عنوان البريد الإلكتروني المرتبط بالحساب، إذا كان متوفّرًا.
email_verified true إذا أثبت المستخدم ملكية إمكانية الوصول إلى عنوان email. يثبت بعض مقدّمي الخدمة تلقائيًا ملكية عناوين البريد الإلكتروني التي يملكونها.
phone_number تمثّل هذه السمة رقم الهاتف المرتبط بالحساب، إذا كان متوفّرًا.
name الاسم المعروض للمستخدم، إذا تم ضبطه.
sub المعرّف الفريد في Firebase للمستخدم هذا فريد داخل المشروع.
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 تم استخدامه في وقت سابق ضِمن بنية قواعد.

عندما يكون لديك $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 في الوقت الفعلي.

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

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

الجذر

RuleDataSnapshot: مطابق للبيانات الحالية في جذر "قاعدة بيانات Firebase" في الوقت الفعلي.

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

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

بعد ذلك، إذا احتوت /users/barney/active على القيمة true، تتم المصادقة على المستخدم بمعرّف "barney" من الكتابة إلى العقدة /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();

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

RuleDataSnapshot: الطُرق

val()

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

القيمة المعروضة: (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 للموقع الجغرافي الفرعي.

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

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

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

parent()

الحصول على RuleDataSnapshot للموقع الجغرافي الرئيسي

القيمة المعروضة: RuleDataSnapshot: RuleDataSnapshot للموقع الجغرافي الرئيسي

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

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

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

hasChild(childPath)

يعرض true إذا كان العنصر الثانوي المحدد موجودًا.

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

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

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

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

hasChildren([children])

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

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

القيمة المعروضة: Boolean - true في حال وجود العناصر الثانوية (المحددة) آخر false.

إذا لم يتم تقديم أي وسيطات، سيتم عرض القيمة "صحيح" إذا كانت السمة RuleDataSnapshot تتضمّن أي عناصر ثانوية. إذا تم توفير مصفوفة من الأسماء الفرعية، لن تعرض القيمة "صحيح" إلا إذا كانت جميع العناصر الثانوية المحدّدة موجودة في RuleDataSnapshot.

لا يسمح هذا المثال بكتابة البيانات إلا إذا كانت تحتوي على عنصر ثانوي واحد أو أكثر.

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

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

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

متوفّر()

تعرض القيمة true إذا كانت RuleDataSnapshot تحتوي على أي بيانات.

عرض القيمة: Boolean - true إذا كانت RuleDataSnapshot تحتوي على أي بيانات false أخرى.

تعرض الدالة متوفّرة القيمة "صحيح" إذا كانت RuleDataSnapshot تحتوي على أي بيانات. إنّها دالة ملائمة بالطبع لأن data.exists() تعادل data.val() != null.

يسمح هذا المثال بالكتابة في هذا الموقع طالما لا توجد بيانات حالية.

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

getPriority()

الحصول على أولوية البيانات في RuleDataSnapshot.

القيمة المعروضة: (String، Number، Null) - أولوية البيانات في RuleDataSnapshot.

يضمن هذا المثال أن تكون للبيانات الجديدة التي تتم كتابتها أولوية

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

isNumber()

تعرض القيمة true إذا كانت RuleDataSnapshot تحتوي على قيمة رقمية.

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

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

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

isString()

تعرض القيمة true إذا كانت RuleDataSnapshot تحتوي على قيمة سلسلة.

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

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

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

isBoolean()

تعرض القيمة true إذا كانت RuleDataSnapshot تحتوي على قيمة منطقية.

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

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

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

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

الطول

تعرض طول السلسلة.

القيمة المعروضة: Number - عدد الأحرف في السلسلة

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

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

سلسلة: الطرق

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

لعرض true إذا كانت السلسلة تحتوي على السلسلة الفرعية المحددة.

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

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

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

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

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

لعرض true إذا كانت السلسلة تبدأ بالسلسلة الفرعية المحددة.

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

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

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

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

EndWith(سلسلة فرعية)

لعرض true إذا كانت السلسلة تنتهي بالسلسلة الفرعية المحددة.

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

القيمة المعروضة: Boolean - true إذا كانت السلسلة تنتهي بالسلسلة الفرعية المحدّدة، آخر false.

يتيح هذا المثال إمكانية الوصول للقراءة في حال انتهاء auth.token.identifier بـ " @company.com".

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

الاستبدال(سلسلة فرعية، الاستبدال)

عرض نسخة من السلسلة مع استبدال جميع مثيلات السلسلة الفرعية المحددة بسلسلة الاستبدال المحددة.

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

القيمة المعروضة: String - السلسلة الجديدة بعد استبدال السلسلة الفرعية بالاستبدال.

تختلف الطريقة replace() قليلاً عن طريقة replace() في JavaScript من حيث أنّها تستبدل جميع مثيلات سلسلة فرعية محدّدة بسلسلة الاستبدال المحددة، وليس فقط المثيل الأول.

نظرًا لعدم السماح بالنقاط في المفاتيح، نحتاج إلى إلغاء السلاسل التي تتضمن نقاطًا قبل تخزينها. ومن الأمثلة على ذلك عناوين البريد الإلكتروني. لنفترض أن لدينا قائمة بعناوين البريد الإلكتروني المضافة إلى القائمة البيضاء في عقدة /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()"
      }
    }
  }
}

tolowCase()

لعرض نسخة من السلسلة تم تحويلها إلى حالة أحرف صغيرة.

قيمة العرض: String - السلسلة التي تم تحويلها إلى أحرف صغيرة.

يتيح هذا المثال إمكانية الوصول للقراءة في حال كانت auth.token.identifier كجميع الأحرف الصغيرة ضِمن /users.

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

toUpperCase()

لعرض نسخة من السلسلة تم تحويلها إلى حالة أحرف كبيرة.

قيمة العرض: String - السلسلة التي تم تحويلها إلى أحرف كبيرة.

يتيح هذا المثال إمكانية الوصول للقراءة في حال توفُّر جميع الأحرف الكبيرة في السمة auth.token.identifier ضمن /users.

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

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

لعرض true إذا كانت السلسلة تطابق التعبير العادي المحدد الحرفي.

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

اطّلِع على جميع مستندات قواعد التعبير العادي.

عوامل التشغيل

+ (إضافة)

يُستخدم لإضافة المتغيّرات أو لتسلسل السلاسل.

يضمن المثال التالي أنّ القيمة الجديدة تزيد القيمة الحالية بمقدار واحد بالضبط. يُعد هذا مفيدًا لتنفيذ العدّاد:

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

|| (أو)

يتم تقييمها إلى "صحيح" إذا كان أحد المعاملات في تعبير القواعد true.

في هذا المثال، يمكننا الكتابة طالما لم تكن البيانات القديمة أو البيانات الجديدة موجودة. بمعنى آخر، يمكننا الكتابة إذا كنا سنقوم بحذف البيانات أو إنشائها، ولكن لا يمكننا تحديث البيانات.

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

! (ليس)

يتم تقييمها على "صحيح" إذا كان معاملها الفردي false. في تعبيرات القواعد، تبدأ ! يُستخدم غالبًا لمعرفة ما إذا كانت البيانات قد تمت كتابتها في موقع ما.

لا تسمح القاعدة التالية بالوصول للكتابة إلا في حال عدم وجود بيانات في الموقع المحدد:

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

> (أكبر من)

يُستخدَم للتحقق مما إذا كانت القيمة أكبر من قيمة أخرى في تعبير القواعد.

تتحقّق قاعدة التحقق هذه من أنّ السلسلة التي تتم كتابتها ليست سلسلة فارغة:

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

&lt; (أقل من)

يُستخدَم للتحقق مما إذا كانت القيمة أقل من قيمة أخرى في تعبير القواعد.

تتحقّق قاعدة التحقق هذه من أنّ السلسلة أقل من 20 حرفًا:

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

>= (أكبر من أو يساوي)

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

تتحقّق قاعدة التحقق هذه من أنّ السلسلة التي تتم كتابتها ليست سلسلة فارغة:

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

<= (أقل من أو يساوي)

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

تضمن قاعدة التحقق هذه عدم إمكانية إضافة البيانات الجديدة في المستقبل:

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

؟ (مشغّل ثلاثي)

تُستخدَم لتقييم تعبير قواعد شرطية.

يأخذ المشغل الثلاثي ثلاثة معاملات. المعامل قبل ? هي الشرط. وإذا تم تقييم الشرط إلى true، فيتم تقييم المعامل الثاني. وإذا كان الشرط false، فيتم تقييم المعامل الثالث.

بالنسبة إلى قاعدة التحقق التالية، يمكن أن تكون القيمة الجديدة رقمًا أو قيمة منطقية. إذا كان رقمًا، يجب أن يكون أكبر من 0.

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