تسمح لك قواعد أمان Cloud Firestore بالتحكم في الوصول إلى المستندات والمجموعات في قاعدة البيانات الخاصة بك. يسمح لك بناء جملة القواعد المرنة بإنشاء قواعد تتطابق مع أي شيء، بدءًا من جميع عمليات الكتابة إلى قاعدة البيانات بأكملها وحتى العمليات على مستند معين.
يصف هذا الدليل البنية الأساسية وبنية قواعد الأمان. قم بدمج بناء الجملة هذا مع شروط قواعد الأمان لإنشاء مجموعات قواعد كاملة.
إعلان الخدمة وقاعدة البيانات
تبدأ قواعد أمان Cloud Firestore دائمًا بالإعلان التالي:
service cloud.firestore {
match /databases/{database}/documents {
// ...
}
}
يقوم إعلان service cloud.firestore
بنطاق القواعد على Cloud Firestore، مما يمنع التعارضات بين قواعد أمان Cloud Firestore وقواعد المنتجات الأخرى مثل 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 (غير مسموح) |
الحد الأقصى لعدد التعبيرات التي يتم تقييمها لكل طلب | 1000 |
الحد الأقصى لحجم مجموعة القواعد | يجب أن تلتزم مجموعات القواعد بحدين للحجم:
|
الخطوات التالية
- كتابة شروط قواعد الأمان المخصصة .
- اقرأ مرجع قواعد الأمان .