آلية عمل "قواعد الأمان"

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

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

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

Cloud Firestore

البنية الأساسية

Firebase Security Rules في 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 الملائمتان تمكين الوصول الواسع للقراءة والكتابة في قاعدة البيانات أو مسار التخزين المحدد.
  • المسار: قاعدة البيانات أو مكان التخزين، يتم تمثيله على أنّه مسار ملف شخصي على الإنترنت.
  • القاعدة: عبارة allow التي تتضمّن شرطًا يسمح بتقديم طلب إذا تم تقييمه على أنّه صحيح.

الإصدار 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 عمليات كتابة وأن قواعد الأمان تستخدم مستندين والوصول إلى الاتصالات للتحقق من كل كتابة. في هذه الحالة، تستخدم كل عملية كتابة يستخدم طلبان من 10 مكالمات وصول وطلب الكتابة المجمّعة 6 يبلغ عددها 20 اتصالاً.

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

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

الحد الأقصى لعمق عبارة match المتداخلة 10
يُسمح بالحد الأقصى لطول المسار في أجزاء المسار ضمن مجموعة من المسارات المتداخلة match كشف حساب 100
الحد الأقصى لعدد متغيرات التقاط المسارات المسموح بها ضمن مجموعة من عبارات match مدمَجة 20
الحد الأقصى لعمق طلب الدالة 20
الحد الأقصى لعدد وسيطات الدوال 7
الحد الأقصى لعدد عمليات ربط المتغيّرات let لكل دالة 10
الحد الأقصى لعدد طلبات الدوال التكرارية أو الدورية 0 &lpar;غير مسموح به&rpar;
الحد الأقصى لعدد التعبيرات التي يتم تقييمها لكل طلب 1,000
الحد الأقصى لحجم مجموعة القواعد يجب أن تمتثل القواعد لحدين للحجم:
  • حدّ أقصى يبلغ 256 كيلوبايت لحجم مصدر النص الخاص بقواعد القواعد المنشورة من وحدة تحكّم Firebase أو من وحدة تحكّم سطر الأوامر باستخدام firebase deploy
  • حد يبلغ 250 كيلوبايت لحجم مجموعة القواعد المجمّعة التي تنتج عندما يعالج Firebase المصدر ويفعّله على الخلفية.

Cloud Storage

البنية الأساسية

Firebase Security Rules في 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 الملائمتان تمكين الوصول الواسع للقراءة والكتابة في قاعدة البيانات أو مسار التخزين المحدد.
  • المسار: قاعدة البيانات أو مكان التخزين، يتم تمثيله على أنّه مسار ملف شخصي على الإنترنت.
  • القاعدة: عبارة allow، التي تتضمن شرطًا يسمح إذا تم تقييمه على true.

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

Cloud Storage Security Rules match مسارات الملفات المستخدَمة للوصول إلى الملفات في Cloud Storage. يمكن للقواعد 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 نمط باستخدام أحرف البدل. حرف البدل هو متغير مُسمى يمثل إما سلسلة واحدة مثل 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 لنتيجة جميع تقييمات القواعد. أي إذا تم تقييم أي قاعدة تطابقها الملف مع true، سيتم النتيجة هي true.

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

يمكن الإشارة إلى متغيّر حرف البدل من داخل ملف تقديم match. تفويض الاسم أو المسار:

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

لا يتصاعد Cloud Storage Security Rules، ولا يتم تقييم القواعد إلا عند يتطابق مسار الطلب مع مسار بالقواعد المحدّدة.

طلب تقييم

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

يحتوي كائن request أيضًا على المعرّف الفريد للمستخدم حمولة Firebase Authentication في الكائن request.auth، والتي سيتم أوضحنا بالتفصيل في قسم المصادقة قسم المستندات.

في ما يلي قائمة كاملة بالسمات في الكائن request:

الموقع النوع الوصف
auth خريطة<string, string> عندما يكون المستخدم مسجّلاً الدخول، ويقدم uid والمعرّف الفريد للمستخدم token، خريطة تضم Firebase Authentication مطالبات JWT. بخلاف ذلك، ستكون null
params خريطة<string, string> خريطة تحتوي على مَعلمات طلب البحث الخاصة بالطلب
path المسار path يمثّل المسار الذي يتم تنفيذ الطلب عليه
resource خريطة<string, string> لا تتوفّر قيمة المورد الجديدة إلا في طلبات write.
time الطابع الزمني طابع زمني يمثّل وقت الخادم الذي يتم تقييم الطلب فيه

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

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

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

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

تتوفّر أدناه قائمة كاملة بالسمات في العنصر resource:

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

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

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

أثناء العمل مع قواعد الأمان، يُرجى مراعاة الحدود التالية:

الحدّ المسموح به التفاصيل
الحد الأقصى لعدد firestore.exists() firestore.get() مكالمة لكل طلب

2 لطلبات المستند الواحد وطلبات البحث.

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

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

مثال كامل

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

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 Database

البنية الأساسية

في Realtime Database، يتكون Firebase Security Rules من تعبيرات تشبه JavaScript مضمنة في مستند JSON.

يستخدم بناء الجملة التالي:

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

تتضمّن القاعدة ثلاثة عناصر أساسية:

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

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

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

يُرجى مراعاة القواعد التالية:

{
  "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. ومع ذلك، فإن النتيجة الفعلية هي خطأ:

JavaScript
var db = firebase.database();
db.ref("records").once("value", function(snap) {
  // success method is not called
}, function(err) {
  // error callback triggered with PERMISSION_DENIED
});
Objective-C
ملاحظة: لا يتوفّر منتج Firebase هذا في هدف App Clip.
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
}];
Swift
ملاحظة: لا يتوفّر منتج Firebase هذا في هدف App Clip.
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
  });
});
REST
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، يجب الوصول إليه مباشرةً:

JavaScript
var db = firebase.database();
db.ref("records/rec1").once("value", function(snap) {
  // SUCCESS!
}, function(err) {
  // error callback is not called
});
Objective-C
ملاحظة: لا يتوفّر منتج Firebase هذا في هدف App Clip.
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[ref child:@"records/rec1"] observeSingleEventOfType:FEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
    // SUCCESS!
}];
Swift
ملاحظة: لا يتوفّر منتج Firebase هذا في هدف App Clip.
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
  }
});
REST
curl https://docs-examples.firebaseio.com/rest/records/rec1
# SUCCESS!

متغيّر الموقع الجغرافي

Realtime Database Rules تدعم $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 }
      }
    }
  }