تسمح لك Cloud Firestore Security Rules بالتحكّم في الوصول إلى المستندات المجموعات في قاعدة البيانات لديك. تسمح لك بنية القواعد المرنة بإنشاء من القواعد التي تطابق أي شيء، بدءًا من جميع عمليات الكتابة إلى قاعدة البيانات بأكملها إلى العمليات في وثيقة محددة
يصف هذا الدليل البنية الأساسية لقواعد الأمان وبنيتها. دمج هذه البنية مع شروط قواعد الأمان لإنشاء ومجموعات قواعد كاملة.
بيان الخدمة وقاعدة البيانات
تبدأ الدالة Cloud Firestore Security Rules دائمًا بالبيان التالي:
service cloud.firestore {
match /databases/{database}/documents {
// ...
}
}
يحدّد بيان service cloud.firestore
القواعد
Cloud Firestore، ما يؤدي إلى منع التعارضات بين Cloud Firestore Security Rules و
قواعد المنتجات الأخرى مثل Cloud Storage.
يحدد إعلان match /databases/{database}/documents
أن القواعد يجب
لمطابقة أي قاعدة بيانات Cloud Firestore في المشروع. حاليًا كل مشروع
تتضمن قاعدة بيانات واحدة فقط باسم (default)
.
قواعد القراءة/الكتابة الأساسية
تتكون القواعد الأساسية من عبارة match
تحدد مسار المستند
يُسمح باستخدام تعبير allow
يفصّل عند قراءة البيانات المحدّدة:
service cloud.firestore {
match /databases/{database}/documents {
// Match any document in the 'cities' collection
match /cities/{city} {
allow read: if <condition>;
allow write: if <condition>;
}
}
}
يجب أن تشير كل عبارات المطابقة إلى المستندات، وليس إلى المجموعات. مطابقة
يمكن أن تشير العبارة إلى مستند معيّن، كما في match /cities/SF
أو استخدام أحرف البدل
للإشارة إلى أي مستند في المسار المحدد، كما في match /cities/{city}
.
في المثال أعلاه، تستخدِم عبارة المطابقة بنية حرف البدل {city}
.
وهذا يعني أن القاعدة تنطبق على أي مستند في مجموعة cities
، مثل
/cities/SF
أو /cities/NYC
. عندما تكون تعبيرات allow
في عبارة المطابقة
سيتم تحليل المتغير city
مع اسم مستند المدينة،
مثل SF
أو NYC
.
العمليات الدقيقة
في بعض الحالات، من المفيد تقسيم read
وwrite
إلى أقسام.
العمليات الدقيقة. على سبيل المثال، قد يحتاج تطبيقك إلى فرض قيود
الشروط عند إنشاء المستند مقارنةً بحذف المستند. أو قد ترغب في
السماح بعمليات قراءة مستند واحد لكن مع رفض الاستعلامات الكبيرة.
يمكن تقسيم قاعدة read
إلى get
وlist
، بينما يمكن تقسيم قاعدة write
.
مقسمة إلى create
وupdate
وdelete
:
service cloud.firestore {
match /databases/{database}/documents {
// A read rule can be divided into get and list rules
match /cities/{city} {
// Applies to single document read requests
allow get: if <condition>;
// Applies to queries and collection read requests
allow list: if <condition>;
}
// A write rule can be divided into create, update, and delete rules
match /cities/{city} {
// Applies to writes to nonexistent documents
allow create: if <condition>;
// Applies to writes to existing documents
allow update: if <condition>;
// Applies to delete operations
allow delete: if <condition>;
}
}
}
البيانات الهرمية
يتم تنظيم البيانات في "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() لكل طلب |
يؤدي تجاوز أي من هذين الحدّين إلى ظهور خطأ "تم رفض الإذن". قد يتم تخزين بعض مكالمات الوصول إلى المستندات مؤقتًا، ولن يتم احتساب الاتصالات المخزنة مؤقتًا ضمن الحدود المسموح بها. |
الحد الأقصى لعمق عبارة match المتداخلة |
10 |
يُسمح بالحد الأقصى لطول المسار في أجزاء المسار ضمن مجموعة من المسارات المتداخلة
match كشف حساب |
100 |
الحد الأقصى لعدد متغيرات التقاط المسارات المسموح بها ضمن مجموعة من
عبارات match مدمَجة |
20 |
الحد الأقصى لعمق طلب الدالة | 20 |
الحد الأقصى لعدد وسيطات الدوال | 7 |
الحد الأقصى لعدد عمليات ربط المتغيّرات let لكل دالة |
10 |
الحد الأقصى لعدد طلبات الدوال التكرارية أو الدورية | 0 (غير مسموح به) |
الحد الأقصى لعدد التعبيرات التي تم تقييمها لكل طلب | 1,000 |
الحد الأقصى لحجم مجموعة القواعد | يجب أن تمتثل القواعد لحدين للحجم:
|
الخطوات التالية
- كتابة شروط قواعد الأمان المخصَّصة
- اطّلِع على مرجع قواعد الأمان.