كيف تعمل قواعد الأمان

يمكن أن يكون الأمان أحد أكثر الأجزاء تعقيدًا في أحجية تطوير التطبيق. في معظم التطبيقات ، يجب على المطورين إنشاء وتشغيل خادم يتعامل مع المصادقة (من هو المستخدم) والترخيص (ما يمكن للمستخدم القيام به).

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

حدد منتجًا لمعرفة المزيد عن قواعده.

سحابة Firestore

تركيب اساسي

تستخدم قواعد أمان Firebase في Cloud Firestore و Cloud Storage البنية والبنية التالية:

service <<name>> {
  // Match the resource path.
  match <<path>> {
    // Allow the request if the following conditions are true.
    allow <<methods>> : if <<condition>>
  }
}

من المهم فهم المفاهيم الأساسية التالية أثناء بناء القواعد:

  • طلب: طريقة أو طرق الاحتجاج في allow بيان. هذه هي الطرق التي تسمح لك بتشغيلها. الطرق القياسية هي: get ، list ، create ، update ، و delete . و read و write تمكن أساليب الراحة واسع القراءة والكتابة الوصول إلى قاعدة بيانات أو تخزين المسار المحدد.
  • مسار: قاعدة البيانات أو موقع التخزين، ممثلة كمسار URI.
  • الحكم: إن allow البيان، الذي يتضمن شرط أن يسمح طلب إذا كان تقييم إلى true.

الإصدار 2 من قواعد الأمان

اعتبارًا من مايو 2019 ، أصبح الإصدار 2 من قواعد أمان Firebase متاحًا الآن. صفحة 2 من النظام تغيير سلوك البدل متكررة {name=**} . يجب استخدام الإصدار 2 إذا كنت تخطط لاستخدام الاستفسارات مجموعة جمع . يجب التقيد في لالإصدار 2 بجعل rules_version = '2'; السطر الأول في قواعد الأمان الخاصة بك:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

مسارات مطابقة

يجب أن تشير جميع بيانات المطابقة إلى المستندات وليس المجموعات. وجاء في بيان مباراة يمكن أن نشير إلى وثيقة محددة، كما هو الحال في match /cities/SF أو استخدام أحرف البدل للإشارة إلى أي وثيقة في مسار محدد، كما هو الحال في match /cities/{city} .

في المثال أعلاه، يستخدم بيان مباراة {city} جملة بدل. وهذا يعني تطبيق القاعدة على أي وثيقة في cities جمع، مثل /cities/SF أو /cities/NYC . عندما allow يتم تقييم التعبيرات في بيان المباراة، و city ومتغير حل لاسم المستند المدينة، مثل SF أو NYC .

مطابقة المجموعات الفرعية

يتم تنظيم البيانات في Cloud Firestore في مجموعات من المستندات ، وقد يوسع كل مستند التسلسل الهرمي من خلال المجموعات الفرعية. من المهم فهم كيفية تفاعل قواعد الأمان مع البيانات الهرمية.

النظر في الحالة التي يكون فيها كل وثيقة في cities يحتوي على مجموعة من landmarks المجموعة الفرعية. تطبيق قواعد الأمن فقط في مسار مطابقة، وبالتالي فإن عناصر التحكم في الوصول المعرفة على cities لا تنطبق جمع إلى landmarks المجموعة الفرعية. بدلاً من ذلك ، اكتب قواعد صريحة للتحكم في الوصول إلى المجموعات الفرعية:

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      allow read, write: if <condition>;

      // Explicitly define rules for the 'landmarks' subcollection
      match /landmarks/{landmark} {
        allow read, write: if <condition>;
      }
    }
  }
}

عندما تعشش match التصريحات، مسار داخلي match البيان هو دائما بالنسبة لمسار الخارجي match بيان. وبالتالي فإن القواعد التالية متكافئة:

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      match /landmarks/{landmark} {
        allow read, write: if <condition>;
      }
    }
  }
}
service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city}/landmarks/{landmark} {
      allow read, write: if <condition>;
    }
  }
}

أحرف البدل العودية

إذا كنت تريد قواعد لتطبيق التسلسل الهرمي العميق تعسفا، استخدم بناء الجملة بدل العودية، {name=**} :

service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the cities collection as well as any document
    // in a subcollection.
    match /cities/{document=**} {
      allow read, write: if <condition>;
    }
  }
}

عند استخدام صيغة أحرف البدل العودية ، سيحتوي متغير حرف البدل على مقطع المسار المطابق بالكامل ، حتى إذا كان المستند موجودًا في مجموعة فرعية متداخلة بعمق. على سبيل المثال، فإن قواعد المذكورة أعلاه تطابق وثيقة تقع في /cities/SF/landmarks/coit_tower ، وقيمة document من شأنه أن يكون متغير SF/landmarks/coit_tower .

لاحظ ، مع ذلك ، أن سلوك أحرف البدل العودية يعتمد على إصدار القواعد.

النسخة 1

تستخدم قواعد الأمان الإصدار 1 افتراضيًا. في الإصدار 1 ، تتطابق أحرف البدل العودية مع عنصر مسار واحد أو أكثر. كانت لا تطابق مسار فارغة، لذلك match /cities/{city}/{document=**} مباريات الوثائق في المجموعات الفرعية ولكن ليس في cities جمع، في حين أن match /cities/{document=**} مباريات كلتا الوثيقتين في cities جمع والمجموعات الفرعية.

يجب أن تأتي أحرف البدل العودية في نهاية بيان المباراة.

الإصدار 2

في الإصدار 2 من قواعد الأمان ، تطابق أحرف البدل العودية صفرًا أو أكثر من عناصر المسار. match/cities/{city}/{document=**} مباريات الوثائق في أي من المجموعات الفرعية فضلا عن وثائق في cities جمع.

يجب التقيد في الإصدار 2 بإضافة rules_version = '2'; في الجزء العلوي من قواعد الأمان الخاصة بك:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the cities collection as well as any document
    // in a subcollection.
    match /cities/{city}/{document=**} {
      allow read, write: if <condition>;
    }
  }
}

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

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the songs collection group
    match /{path=**}/songs/{song} {
      allow read, write: if <condition>;
    }
  }
}

إذا كنت تستخدم الاستفسارات مجموعة جمع ، يجب استخدام الإصدار 2، انظر تأمين الاستفسارات مجموعة جمع .

تداخل بيانات المباراة

فمن الممكن لإعداد وثيقة لمباراة أكثر من match بيان. في الحالة التي يكون فيها متعددة allow تعابير تطابق طلب، يسمح بالوصول إذا كان أي من الشروط غير true :

service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the 'cities' collection.
    match /cities/{city} {
      allow read, write: if false;
    }

    // Matches any document in the 'cities' collection or subcollections.
    match /cities/{document=**} {
      allow read, write: if true;
    }
  }
}

في المثال أعلاه، كل يقرأ ويكتب إلى cities سيسمح جمع لأن القاعدة الثانية هي دائما true ، على الرغم من أن القاعدة الأولى هي دائما false .

حدود قواعد الأمان

أثناء العمل مع قواعد الأمان ، لاحظ الحدود التالية:

حد تفاصيل
الحد الأقصى لعدد exists() ، get() ، و getAfter() يدعو في طلب
  • 10 لطلبات وثيقة واحدة وطلبات الاستعلام.
  • 20 للقراءات متعددة المستندات والمعاملات والكتابات المجمعة. ينطبق الحد السابق البالغ 10 أيضًا على كل عملية.

    على سبيل المثال ، تخيل أنك تقوم بإنشاء طلب كتابة مجمّع مع 3 عمليات كتابة وأن قواعد الأمان الخاصة بك تستخدم مكالمتي وصول إلى المستندات للتحقق من صحة كل عملية كتابة. في هذه الحالة ، تستخدم كل عملية كتابة 2 من 10 مكالمات وصول ويستخدم طلب الكتابة المجمّع 6 من أصل 20 مكالمة وصول.

يؤدي تجاوز أي من الحدين إلى خطأ رفض الإذن.

قد يتم تخزين بعض مكالمات الوصول إلى المستندات مؤقتًا ، ولا يتم احتساب المكالمات المخزنة مؤقتًا ضمن الحدود.

الحد الأقصى متداخلة match عمق بيان 10
طول مسار الأقصى، في قطاعات المسار، المسموح بها ضمن مجموعة من المتداخلة match البيانات 100
يسمح الحد الأقصى لعدد المتغيرات التقاط مسار ضمن مجموعة من المتداخلة match البيانات 20
الحد الأقصى لعمق استدعاء الوظيفة 20
العدد الأقصى لوسائط الدوال 7
الحد الأقصى لعدد let الارتباطات متغير في وظيفة 10
الحد الأقصى لعدد استدعاءات الدوال المتكررة أو الدورية 0 (غير مسموح)
تم تقييم الحد الأقصى لعدد التعبيرات لكل طلب 1،000
الحجم الأقصى لمجموعة القواعد يجب أن تلتزم القواعد بحدود حجم:
  • حد 256 KB على حجم المصدر نص مجموعة الأوامر تصدر من وحدة Firebase أو من CLI باستخدام firebase deploy .
  • حد 250 كيلو بايت لحجم مجموعة القواعد المترجمة والذي ينتج عندما يعالج Firebase المصدر ويجعله نشطًا في النهاية الخلفية.

سحابة التخزين

تركيب اساسي

تستخدم قواعد أمان Firebase في Cloud Firestore و Cloud Storage البنية والبنية التالية:

service <<name>> {
  // Match the resource path.
  match <<path>> {
    // Allow the request if the following conditions are true.
    allow <<methods>> : if <<condition>>
  }
}

من المهم فهم المفاهيم الأساسية التالية أثناء بناء القواعد:

  • طلب: طريقة أو طرق الاحتجاج في allow بيان. هذه هي الطرق التي تسمح لك بتشغيلها. الطرق القياسية هي: get ، list ، create ، update ، و delete . و read و write تمكن أساليب الراحة واسع القراءة والكتابة الوصول إلى قاعدة بيانات أو تخزين المسار المحدد.
  • مسار: قاعدة البيانات أو موقع التخزين، ممثلة كمسار URI.
  • الحكم: إن allow البيان، الذي يتضمن شرط أن يسمح طلب إذا كان تقييم إلى true.

مسارات مطابقة

سحابة قواعد الأمن التخزين match مسارات الملفات المستخدمة في الوصول إلى الملفات في سحابة التخزين. يمكن أن قواعد match مسارات دقيقة أو مسارات البدل، ويمكن أيضا أن تتداخل القواعد. إذا سمحت أي حكم المباراة طريقة الطلب، أو التي يقيم شرط false ، تم رفض الطلب.

التطابقات الدقيقة

// Exact match for "images/profilePhoto.png"
match /images/profilePhoto.png {
  allow write: if <condition>;
}

// Exact match for "images/croppedProfilePhoto.png"
match /images/croppedProfilePhoto.png {
  allow write: if <other_condition>;
}

مباريات متداخلة

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/profilePhoto.png"
  match /profilePhoto.png {
    allow write: if <condition>;
  }

  // Exact match for "images/croppedProfilePhoto.png"
  match /croppedProfilePhoto.png {
    allow write: if <other_condition>;
  }
}

مباريات البدل

ويمكن أيضا أن تستخدم قواعد ل match نمط استخدام أحرف البدل. A البدل هو متغير المسمى الذي يمثل إما سلسلة واحدة مثل profilePhoto.png ، أو مقاطع مسارات متعددة، مثل images/profilePhoto.png .

يتم إنشاء البدل بإضافة الأقواس المجعدة حول اسم البدل، مثل {string} . يمكن أن يتم تعريف البدل شريحة متعددة بإضافة =** إلى اسم البدل، مثل {path=**} :

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/*"
  // e.g. images/profilePhoto.png is matched
  match /{imageId} {
    // This rule only matches a single path segment (*)
    // imageId is a string that contains the specific segment matched
    allow read: if <condition>;
  }

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

إذا تطابق قواعد متعددة ملف، والنتيجة هي OR من نتيجة جميع التقييمات القواعد. وهذا هو، إذا أي حكم الملف مباريات evalutes إلى true ، والنتيجة هي true .

في القواعد المذكورة أعلاه، فإن "الصور / profilePhoto.png" ملف يمكن قراءة إذا كان أي condition أو other_condition تقييم إلى true، في حين أن ملف "صور / المستخدمين / المستخدم: 12345 / profilePhoto.png" هو الوحيد تخضع لنتيجة other_condition .

يمكن أن يكون مرجعا متغير بدل من داخل match توفير اسم الملف أو إذن مسار:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

لا تتالي قواعد أمان التخزين السحابي ، ولا يتم تقييم القواعد إلا عندما يتطابق مسار الطلب مع المسار مع القواعد المحددة.

طلب التقييم

يتم تقييم تحميل، تنزيل، والتغيرات الوصفية، والحذف باستخدام request إرسالها إلى سحابة التخزين. و request يحتوي على متغير مسار الملف حيث يتم تنفيذ الطلب، وقت استلام الطلب، والجديد resource القيمة إذا كان الطلب هو الكتابة. يتم أيضًا تضمين رؤوس HTTP وحالة المصادقة.

و request يحتوي الكائن على اسم مستخدم فريد المستخدم والحمولة مصادقة Firebase في request.auth الكائن، والذي سيتم شرحه في مصادقة القسم من مستندات.

قائمة كاملة من العقارات في request الكائن متاح أدناه:

ملكية نوع وصف
auth الخريطة <سلسلة ، سلسلة> عندما يوفر للمستخدم بتسجيل الدخول، uid ، معرف فريد للمستخدم، و token خريطة المطالبات Firebase مصادقة JWT،. خلاف ذلك، سيكون null .
params الخريطة <سلسلة ، سلسلة> خريطة تحتوي على معامِلات طلب البحث الخاصة بالطلب.
path طريق A path يمثل المسار يتم تنفيذ الطلب في.
resource الخريطة <سلسلة ، سلسلة> قيمة الموارد الجديدة، يقدم فقط على write الطلبات.
time الطابع الزمني طابع زمني يمثل وقت تقييم الطلب على الخادم.

تقييم الموارد

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

قواعد الأمن Firebase لسحابة التخزين يوفر ملف الفوقية في resource الكائن، والذي يحتوي على مفتاح أزواج / قيمة البيانات الوصفية ظهرت في كائن سحابة التخزين. يمكن أن يتم فحص هذه الخصائص على read أو write طلبات لضمان سلامة البيانات.

على write طلبات (مثل الإضافات والتحديثات الوصفية، والحذف)، بالإضافة إلى resource الكائن، والذي يحتوي على بيانات التعريف لملف موجود حاليا في مسار الطلب، لديك أيضا القدرة على استخدام request.resource الكائن، الذي يحتوي على مجموعة فرعية من البيانات الوصفية للملف المراد كتابتها في حالة السماح بالكتابة. يمكنك استخدام هاتين القيمتين لضمان تكامل البيانات أو فرض قيود التطبيق مثل نوع الملف أو حجمه.

قائمة كاملة من الخصائص في resource الكائن متاح أدناه:

ملكية نوع وصف
name سلسلة الاسم الكامل للكائن
bucket سلسلة اسم المستودع الذي يتواجد فيه هذا الكائن.
generation int و الجيل الكائن جوجل سحابة التخزين من هذا الكائن.
metageneration int و metageneration الكائن جوجل سحابة التخزين من هذا الكائن.
size int حجم الكائن بالبايت.
timeCreated الطابع الزمني طابع زمني يمثل الوقت الذي تم فيه إنشاء كائن.
updated الطابع الزمني طابع زمني يمثل وقت آخر تحديث للعنصر.
md5Hash سلسلة تجزئة MD5 للكائن.
crc32c سلسلة تجزئة crc32c للكائن.
etag سلسلة etag المرتبطة بهذا الكائن.
contentDisposition سلسلة ترتيب المحتوى المرتبط بهذا الكائن.
contentEncoding سلسلة ترميز المحتوى المرتبط بهذا الكائن.
contentLanguage سلسلة لغة المحتوى المرتبطة بهذا الكائن.
contentType سلسلة نوع المحتوى المرتبط بهذا الكائن.
metadata الخريطة <سلسلة ، سلسلة> أزواج مفتاح / قيمة لبيانات وصفية مخصصة إضافية يحددها المطور.

request.resource يحتوي على كافة هذه باستثناء generation ، metageneration ، etag ، timeCreated ، و updated .

مثال كامل

بتجميعها معًا ، يمكنك إنشاء مثال كامل لقواعد حل تخزين الصور:

service firebase.storage {
 match /b/{bucket}/o {
   match /images {
     // Cascade read to any image type at any path
     match /{allImages=**} {
       allow read;
     }

     // Allow write files to the path "images/*", subject to the constraints:
     // 1) File is less than 5MB
     // 2) Content type is an image
     // 3) Uploaded content type matches existing content type
     // 4) File name (stored in imageId wildcard variable) is less than 32 characters
     match /{imageId} {
       allow write: if request.resource.size < 5 * 1024 * 1024
                    && request.resource.contentType.matches('image/.*')
                    && request.resource.contentType == resource.contentType
                    && imageId.size() < 32
     }
   }
 }
}

قاعدة بيانات الوقت الفعلي

تركيب اساسي

في قاعدة بيانات Realtime ، تتكون قواعد أمان Firebase من تعبيرات شبيهة بجافا سكريبت مضمنة في مستند JSON.

يستخدمون الصيغة التالية:

{
  "rules": {
    "<<path>>": {
    // Allow the request if the condition for each method is true.
      ".read": <<condition>>,
      ".write": <<condition>>,
      ".validate": <<condition>>
    }
  }
}

هناك ثلاثة عناصر أساسية في القاعدة:

  • مسار: موقع قاعدة البيانات. هذا يعكس بنية JSON لقاعدة البيانات الخاصة بك.
  • الطلب: هذه هي طرق الاستخدامات القاعدة على منح حق الوصول. و read و write قواعد منح قراءة واسعة وصول الكتابة، في حين validate تعمل القواعد التحقق الثانوي للوصول إلى منحة استنادا إلى بيانات واردة أو موجودة.
  • الشرط: الشرط الذي يسمح طلب إذا كان تقييم إلى true.

كيف تنطبق القواعد على المسارات

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

ضع في اعتبارك القواعد التالية:

{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          // ignored, since read was allowed already
          ".read": false
        }
     }
  }
}

هذا الهيكل الأمني يسمح /bar/ يجب أن تقرأ من أي وقت /foo/ يحتوي على الطفل baz مع القيمة true . و ".read": false الحكم تحت /foo/bar/ ليس له أي تأثير هنا، منذ وصول لا يمكن أن تلغى بواسطة مسار الطفل.

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

ومع ذلك، .validate قواعد لا تتالي. يجب استيفاء جميع قواعد التحقق على جميع مستويات التسلسل الهرمي للسماح بالكتابة.

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

{
  "rules": {
    "records": {
      "rec1": {
        ".read": true
      },
      "rec2": {
        ".read": false
      }
    }
  }
}

دون فهم أن القواعد يتم تقييم بالذرة، قد يبدو مثل جلب /records/ مسار سيعود rec1 ولكن ليس rec2 . النتيجة الفعلية ، مع ذلك ، هي خطأ:

جافا سكريبت
var db = firebase.database();
db.ref("records").once("value", function(snap) {
  // success method is not called
}, function(err) {
  // error callback triggered with PERMISSION_DENIED
});
ج موضوعية
ملاحظة: هذا المنتج Firebase لا يتوفر على كليب هدف التطبيقات.
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[_ref child:@"records"] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
  // success block is not called
} withCancelBlock:^(NSError * _Nonnull error) {
  // cancel block triggered with PERMISSION_DENIED
}];
سويفت
ملاحظة: هذا المنتج Firebase لا يتوفر على كليب هدف التطبيقات.
var ref = FIRDatabase.database().reference()
ref.child("records").observeSingleEventOfType(.Value, withBlock: { snapshot in
    // success block is not called
}, withCancelBlock: { error in
    // cancel block triggered with PERMISSION_DENIED
})
جافا
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("records");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    // success method is not called
  }

  @Override
  public void onCancelled(FirebaseError firebaseError) {
    // error callback triggered with PERMISSION_DENIED
  });
});
استراحة
curl https://docs-examples.firebaseio.com/rest/records/
# response returns a PERMISSION_DENIED error

منذ عملية قراءة في /records/ غير الذري، وليس هناك حكم قراءة أن منح حق الوصول إلى كافة البيانات تحت /records/ ، وهذا سوف رمي PERMISSION_DENIED الخطأ. إذا كان لنا أن تقييم هذه القاعدة في محاكاة الأمن في منطقتنا وحدة Firebase ، يمكننا أن نرى أن عملية القراءة ونفى:

Attempt to read /records with auth=Success(null)
    /
    /records

No .read rule allowed the operation.
Read was denied.

ورفض العملية لأنه لا يوجد حكم قراءة سمحت الوصول إلى /records/ المسار، ولكن لاحظ أن القاعدة ل rec1 لم يكن تقييمها لأنه لم يكن في مسار طلبنا. لجلب rec1 ، فإننا بحاجة إلى الوصول إليه مباشرة:

جافا سكريبت
var db = firebase.database();
db.ref("records/rec1").once("value", function(snap) {
  // SUCCESS!
}, function(err) {
  // error callback is not called
});
ج موضوعية
ملاحظة: هذا المنتج Firebase لا يتوفر على كليب هدف التطبيقات.
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[ref child:@"records/rec1"] observeSingleEventOfType:FEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
    // SUCCESS!
}];
سويفت
ملاحظة: هذا المنتج Firebase لا يتوفر على كليب هدف التطبيقات.
var ref = FIRDatabase.database().reference()
ref.child("records/rec1").observeSingleEventOfType(.Value, withBlock: { snapshot in
    // SUCCESS!
})
جافا
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("records/rec1");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    // SUCCESS!
  }

  @Override
  public void onCancelled(FirebaseError firebaseError) {
    // error callback is not called
  }
});
استراحة
curl https://docs-examples.firebaseio.com/rest/records/rec1
# SUCCESS!

متغير الموقع

قواعد بيانات في الوقت الحقيقي تدعم $location متغير لتتناسب مع شرائح المسار. استخدام $ بادئة أمام شريحة المسار الخاص بك لمطابقة القاعدة إلى أي العقد التابعة على طول المسار.

  {
    "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')"
          }
        }
      }
    }
  }

يمكنك أيضا استخدام $variable بالتوازي مع أسماء مسار ثابتة.

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