NahdaAIنهضة
Firebase & Supabase • المستوى الثاني • الدرس 1

قواعد أمان Firestore (Security Rules)

العودة لفهرس المستوى

أهداف الدرس العلمية

  • كتابة قواعد الأمان بنظام match و allow لحماية البيانات.
  • استخدام request.auth للتحقق من هوية المستخدم.
  • فحص البيانات القادمة بـ request.resource.data والموجودة بـ resource.data.
  • دمج شروط متعددة باستخدام && و ||.

1. لماذا Security Rules؟

Firestore تكون مكشوفة للعالم افتراضياً في وضع الاختبار (Test Mode). بدون Rules صحيحة، أي شخص يعرف رابط مشروعك يمكنه قراءة وحذف كل بياناتك!

javascript
// خطر! (وضع الاختبار)
allow read, write: if true;
// → أي شخص يقرأ ويكتب كل شيء!

// آمن:
allow read: if request.auth != null;
allow write: if request.auth.uid == userId;
// → المسجلون فقط، والمالك يكتب ملفه الشخصي فقط

2. المتغيرات الأساسية في Rules

request.auth

معلومات المستخدم المُوثَّق (أو null).

  • request.auth.uid — معرف فريد
  • request.auth.token.admin — حقل مخصص
request.resource.data

البيانات القادمة من العميل (سيتم كتابتها).

  • request.resource.data.userId
  • request.resource.data.price
resource.data

البيانات الموجودة حالياً في المستند.

  • resource.data.senderId
  • resource.data.createdAt
allow

يحدد من يمكنه فعل ماذا.

  • allow read — القراءة
  • allow write — الكتابة (شامل create/update/delete)
  • allow create — الإنشاء فقط

3. أنواع العمليات (allow operations)

العمليةالمرادفالاستخدام
readget + listقراءة مستند أو مجموعة
writecreate + update + deleteجميع عمليات الكتابة
create-إنشاء مستند جديد فقط
update-تعديل مستند موجود
delete-حذف مستند

4. أنماط Rules الشائعة

نمط "المالك فقط"
allow write: if request.auth
              .uid == userId;
نمط "قراءة عامة"
allow read: if true;
allow write: if request.auth != null;
نمط "المشرف"
allow write:
  if request.auth.token.admin == true;
نمط "منع الكل افتراضياً"
match /{document=**} {
  allow read, write: if false;
}
التطبيق العملي المباشر

تحدي الدرس الأول: بناء قواعد أمان كاملة

قم بالتعديل على ملف Rules بداخل المحرر أدناه لتطبيق المتطلبات التالية:

  1. احتفظ بقواعد مجموعة users الأصلية.
  2. أضف قواعد لمجموعة products: القراءة للجميع، والكتابة للمشرفين (request.auth.token.admin).
  3. أضف قواعد لمجموعة orders: المستخدم يقرأ طلباته فقط (resource.data.userId).
  4. أضف قواعد لمجموعة messages: القراءة للمسجلين، الحذف لصاحب الرسالة فقط.
  5. أضف قاعدة "منع كل شيء آخر" بـ match /{document=**}.
  6. اضغط "تشغيل الكود" لمعاينة القواعد.
⏳ جارٍ تحميل المحرر التفاعلي...