القاعدة: الأنواع
.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'
. ونتيجةً لذلك، لن تنجح قراءة
إلا إذا تمت مصادقة العميل باستخدام معرّف "barney"./users/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"
< (أقل من)
يُستخدَم للتحقق مما إذا كانت القيمة أقل من قيمة أخرى في تعبير القواعد.
تتحقّق قاعدة التحقق هذه من أنّ السلسلة أقل من 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()"