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

Cloud Firestore Security Rules تتيح لك التحكّم في الوصول إلى المستندات والمجموعات في قاعدة بياناتك. تتيح لك بنية القواعد المرنة إنشاء قواعد تتطابق مع أي شيء، بدءًا من جميع عمليات الكتابة إلى قاعدة البيانات بأكملها وحتى العمليات على مستند معين.

يصف هذا الدليل البنية الأساسية لقواعد الأمان. يمكنك دمج هذه البنية مع شروط قواعد الأمان لإنشاء مجموعات قواعد كاملة.

للحصول على مساعدة من الذكاء الاصطناعي، انسخ الطلب أدناه إلى وكيل الترميز بالذكاء الاصطناعي (مثل Gemini في "استوديو Android" وAntigravity وClaude Code وCodex وCursor). يمكنك تخصيص الطلب وتكراره مع الوكيل. انتقِل إلى مهارات وكلاء Firebase للحصول على معلومات مفصّلة عن التثبيت.

Help me use Firebase in my app.
1. Make sure that **Firebase agent skills** are installed and updated. For Claude Code, Codex, or Cursor agents, help me install the Firebase plugin. For other agents, run `npx skills add firebase/agent-skills`. Always try to use **Firebase agent skills** for Firebase-related tasks.
2. Help me write, validate, and deploy Firebase Security Rules to protect my app's Firestore data.

بيان الخدمة وقاعدة البيانات

تبدأ Cloud Firestore Security Rules دائمًا بالإعلان التالي:

service cloud.firestore {
  // The {database} wildcard allows the rules to reference any database,
  // but these rules are only active on databases where they are explicitly deployed.
  match /databases/{database}/documents {
    // ...
  }
}

يحدّد بيان service cloud.firestore نطاق القواعد على Rules، ما يمنع التعارض بين Cloud Firestore Security Rules وقواعد المنتجات الأخرى، مثل Cloud Storage.

يحدّد بيان match /databases/{database}/documents أنّ القواعد يجب أن تتطابق مع أي قاعدة بيانات للقواعد في المشروع. على الرغم من أنّ المشروع يمكن أن يحتوي على ما يصل إلى 100 قاعدة بيانات، يتم تحديد قاعدة البيانات الأولى التي تم إنشاؤها فقط كقاعدة بيانات تلقائية.

يتم تطبيق Cloud Firestore Security Rules بشكل منفصل لكل قاعدة بيانات مُسمّاة في مشروعك. وهذا يعني أنّه في حال إنشاء قواعد متعددة، عليك إدارة القواعد ونشرها لكل قاعدة بيانات بشكل فردي. للحصول على تعليمات مفصّلة حول نشر التحديثات، يُرجى الاطّلاع على مقالة نشر التحديثات.

قواعد القراءة/الكتابة الأساسية

تتألف القواعد الأساسية من عبارة 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>;
    }
  }
}

البيانات الهرمية

يتم تنظيم البيانات في &quot;القواعد&quot; ضمن مجموعات من المستندات، ويمكن لكل مستند توسيع التسلسل الهرمي من خلال المجموعات الفرعية. من المهم فهم كيفية تفاعل قواعد الأمان مع البيانات الهرمية.

لنفترض أنّ كل مستند في مجموعة 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 أو من واجهة سطر الأوامر (CLI) باستخدام firebase deploy.
  • حدّ أقصى يبلغ 250 كيلوبايت لحجم مجموعة القواعد المجمّعة التي تنتج عندما يعالج Firebase المصدر ويجعله نشطًا في الخلفية.

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