قواعد الأمان الأساسية

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

يصف هذا الدليل بعض حالات الاستخدام الأساسية التي قد ترغب في تنفيذها أثناء إعداد تطبيقك وحماية بياناتك. ومع ذلك، قبل البدء في كتابة القواعد، قد تحتاج إلى معرفة المزيد عن اللغة التي تمت كتابتها بها وسلوكها.

للوصول إلى قواعدك وتعديلها، يُرجى اتّباع الخطوات الموضّحة في مقالة إدارة Firebase 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 data.

القواعد التلقائية: وضع القفل

عند إنشاء قاعدة بيانات أو مثيل تخزين في وحدة تحكّم "Firebase"، يمكنك اختيار ما إذا كانت Firebase Security Rules ستقيّد الوصول إلى بياناتك (وضع القفل) أو ستسمح لأي مستخدم بالوصول إليها (وضع الاختبار). في Cloud Firestore وRealtime Database، تمنع القواعد التلقائية لـ وضع القفل وصول جميع المستخدمين. في Cloud Storage، يمكن للمستخدمين الذين تمت مصادقتهم فقط الوصول إلى حِزم التخزين.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Realtime Database

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

Cloud Storage

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

قواعد بيئة التطوير

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

يُرجى العِلم أنّ Firebase تتيح للعملاء الوصول المباشر إلى بياناتك، وأنّ Firebase Security Rules هي الإجراء الوقائي الوحيد الذي يحظر وصول المستخدمين الضارّين. إنّ تحديد القواعد بشكل منفصل عن منطق المنتج له عدد من المزايا: العملاء ليسوا مسؤولين عن فرض الأمان، ولن تؤدي عمليات التنفيذ التي تتضمّن أخطاء إلى اختراق بياناتك، والأهم من ذلك، أنّك لا تعتمد على خادم وسيط لحماية البيانات من العالم.

جميع المستخدمين الذين تمت مصادقتهم

على الرغم من أنّنا لا ننصح بترك بياناتك متاحة لأي مستخدم سجّل الدخول، قد يكون من المفيد ضبط إذن الوصول لأي مستخدم مصادَق عليه أثناء تطوير تطبيقك.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      ".read": "auth.uid !== null",
      ".write": "auth.uid !== null"
    }
  }
}

Cloud Storage

service firebase.storage {
  match /b/{bucket}/o {
    match /some_folder/{fileName} {
      allow read, write: if request.auth != null;
    }
  }
}

قواعد جاهزة للاستخدام في بيئة الإنتاج

أثناء الاستعداد لنشر تطبيقك، تأكَّد من حماية بياناتك ومن منح المستخدمين إذن الوصول بشكل صحيح. استخدِم Authentication لإعداد إذن الوصول المستنِد إلى المستخدم والقراءة مباشرةً من قاعدة البيانات لإعداد إذن الوصول المستنِد إلى البيانات.

ننصحك بكتابة القواعد أثناء تنظيم بياناتك، لأنّ طريقة إعداد القواعد تؤثر في كيفية تقييد الوصول إلى البيانات في مسارات مختلفة.

إذن الوصول لمالك المحتوى فقط

تفرض هذه القواعد قيودًا على الوصول إلى مالك المحتوى الذي تمّت مصادقته فقط. لا يمكن قراءة البيانات وكتابتها إلا من قِبل مستخدم واحد، ويحتوي مسار البيانات على رقم تعريف المستخدم.

حالات استخدام هذه القاعدة: تعمل هذه القاعدة بشكل جيد إذا كانت البيانات معزولة حسب المستخدم، أي إذا كان المستخدم الوحيد الذي يحتاج إلى الوصول إلى البيانات هو نفسه المستخدم الذي أنشأ البيانات.

حالات عدم عمل هذه القاعدة: لا تعمل مجموعة القواعد هذه عندما يحتاج تعدُّد المستخدمين إلى كتابة البيانات نفسها أو قراءتها، إذ سيستبدل المستخدمون البيانات أو لن يتمكنوا من الوصول إلى البيانات التي أنشأوها.

لإعداد هذه القاعدة: أنشئ قاعدة تؤكّد أنّ المستخدم الذي يطلب الوصول لقراءة البيانات أو كتابتها هو المستخدم الذي يملك هذه البيانات.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{userId}/{document} {
      allow read, write: if request.auth != null && request.auth.uid == userId
    }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "$uid": {
        // Allow only authenticated content owners access to their data
        ".read": "auth !== null && auth.uid === $uid",
        ".write": "auth !== null && auth.uid === $uid"
      }
    }
  }
}

Cloud Storage

// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/file.txt"
    match /user/{userId}/{fileName} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

أذونات وصول مختلطة بين العام والخاص

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

حالات استخدام هذه القاعدة: تعمل هذه القاعدة بشكل جيد مع التطبيقات التي تتطلب عناصر قابلة للقراءة بشكل علني، ولكنها تحتاج إلى تقييد إذن التعديل لمالكي هذه العناصر. على سبيل المثال، تطبيق محادثة أو مدونة.

حالات عدم عمل هذه القاعدة: مثل قاعدة مالك المحتوى فقط، لا تعمل مجموعة القواعد هذه عندما يحتاج تعدُّد المستخدمين إلى تعديل البيانات نفسها. سيقوم المستخدمون في النهاية بالكتابة فوق بيانات بعضهم البعض.

لإعداد هذه القاعدة: أنشِئ قاعدة تتيح إذن القراءة لجميع المستخدمين (أو جميع المستخدمين الذين تمت مصادقتهم)، وتؤكّد أنّ المستخدم الذي يكتب البيانات هو المالك.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      // Allow public reads
      allow read: if true
      // Allow creation if the current user owns the new document
      allow create: if request.auth.uid == request.resource.data.author_uid;
      // Allow updates by the owner, and prevent change of ownership
      allow update: if request.auth.uid == request.resource.data.author_uid
                    && request.auth.uid == resource.data.author_uid;
      // Allow deletion if the current user owns the existing document
      allow delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}

Realtime Database

{
// Allow anyone to read data, but only authenticated content owners can
// make changes to their data

  "rules": {
    "some_path": {
      "$uid": {
        ".read": true,
        // or ".read": "auth.uid !== null" for only authenticated users
        ".write": "auth.uid === $uid"
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/file.txt"
    match /user/{userId}/{fileName} {
      allow read;
      allow write: if request.auth.uid == userId;
    }
  }
}

الوصول المستند إلى السمات والأدوار

لكي تعمل هذه القاعدة، يجب تحديد السمات وتعيينها للمستخدمين في بياناتك. يتحقّق Firebase Security Rules من الطلب من خلال مقارنته بالبيانات من قاعدة البيانات أو البيانات الوصفية للملف لتأكيد الوصول أو رفضه.

حالات تطبيق هذه القاعدة: إذا كنت تسند دورًا إلى المستخدمين، تتيح لك هذه القاعدة تقييد الوصول استنادًا إلى الأدوار أو مجموعات معيّنة من المستخدمين. على سبيل المثال، إذا كنت تخزّن الدرجات، يمكنك تخصيص مستويات وصول مختلفة لمجموعة "الطلاب" (قراءة المحتوى الخاص بهم فقط) ومجموعة "المعلّمين" (قراءة المحتوى الخاص بمادتهم والكتابة فيه) ومجموعة "المدراء" (قراءة كل المحتوى).

حالات عدم عمل هذه القاعدة: في Realtime Database وCloud Storage، لا يمكن لقواعدك استخدام طريقة get() التي يمكن أن تتضمّنها قواعد Cloud Firestore. وبالتالي، عليك تنظيم قاعدة البيانات أو البيانات الوصفية للملفات لتعكس السمات التي تستخدمها في قواعدك.

لإعداد هذه القاعدة: في Cloud Firestore، يمكنك تضمين حقل في مستندات المستخدمين يمكنك قراءته، ثم تنظيم القاعدة لقراءة هذا الحقل ومنح إذن الوصول بشكل مشروط. في Realtime Database، أنشئ مسار بيانات يحدّد مستخدمي تطبيقك ويمنحهم دورًا في عقدة فرعية.

يمكنك أيضًا إعداد مطالبات مخصّصة في Authentication ثم استرداد هذه المعلومات من متغيّر auth.token في أي Firebase Security Rules.

السمات والأدوار المحدّدة بالبيانات

لا تعمل هذه القواعد إلا في Cloud Firestore وRealtime Database.

Cloud Firestore

يُرجى العِلم أنّه في أي وقت تتضمّن فيه قواعدك عملية قراءة، مثل القواعد أدناه، سيتم تحصيل رسوم منك مقابل عملية قراءة في Cloud Firestore.

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, Check a boolean `admin` attribute
    allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"
   }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "${subpath}": {
        //
        ".write": "root.child('users').child(auth.uid).child('role').val() === 'admin'",
        ".read": true
      }
    }
  }
}

سمات وأدوار المطالبات المخصّصة

لتطبيق هذه القواعد، عليك إعداد المطالبات المخصّصة في Firebase Authentication ثم استخدام المطالبات في قواعدك.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an administrator claim
    allow write: if request.auth.token.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if request.auth.token.reader == "true";
     allow write: if request.auth.token.writer == "true";
   }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "$uid": {
        // Create a custom claim for each role or group
        // you want to use
        ".write": "auth.uid !== null && auth.token.writer === true",
        ".read": "auth.uid !== null && auth.token.reader === true"
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  // Allow reads if the group ID in your token matches the file metadata's `owner` property
  // Allow writes if the group ID is in the user's custom token
  match /files/{groupId}/{fileName} {
    allow read: if resource.metadata.owner == request.auth.token.groupId;
    allow write: if request.auth.token.groupId == groupId;
  }
}

سمات الإيجار

لتطبيق هذه القواعد، عليك إعداد التشغيل المتعدد لمثيل برنامج في Google Cloud Identity Platform (GCIP) ثم استخدام المستأجر في قواعدك. تسمح الأمثلة التالية بعمليات الكتابة من مستخدم في مستأجر معيّن، على سبيل المثال، tenant2-m6tyz

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // For tenant-based access control, check for a tenantID
    allow write: if request.auth.token.firebase.tenant == 'tenant2-m6tyz';
    allow read: true;
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "$uid": {
        // Only allow reads and writes if user belongs to a specific tenant
        ".write": "auth.uid !== null && auth.token.firebase.tenant === 'tenant2-m6tyz'",
        ".read": "auth.uid !== null
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  // Only allow reads and writes if user belongs to a specific tenant
  match /files/{tenantId}/{fileName} {
    allow read: if request.auth != null;
    allow write: if request.auth.token.firebase.tenant == tenantId;
  }
}