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