هيكلة قواعد أمان Cloud Firestore

تسمح لك قواعد أمان 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() لكل طلب
  • 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 المصدر ويفعّله على الخلفية.

الخطوات التالية