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.userIdrequest.resource.data.price
resource.data
البيانات الموجودة حالياً في المستند.
resource.data.senderIdresource.data.createdAt
allow
يحدد من يمكنه فعل ماذا.
allow read— القراءةallow write— الكتابة (شامل create/update/delete)allow create— الإنشاء فقط
3. أنواع العمليات (allow operations)
| العملية | المرادف | الاستخدام |
|---|---|---|
| read | get + list | قراءة مستند أو مجموعة |
| write | create + 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 بداخل المحرر أدناه لتطبيق المتطلبات التالية:
- احتفظ بقواعد مجموعة
usersالأصلية. - أضف قواعد لمجموعة
products: القراءة للجميع، والكتابة للمشرفين (request.auth.token.admin). - أضف قواعد لمجموعة
orders: المستخدم يقرأ طلباته فقط (resource.data.userId). - أضف قواعد لمجموعة
messages: القراءة للمسجلين، الحذف لصاحب الرسالة فقط. - أضف قاعدة "منع كل شيء آخر" بـ
match /{document=**}. - اضغط "تشغيل الكود" لمعاينة القواعد.
⏳ جارٍ تحميل المحرر التفاعلي...