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

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

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

للوصول إلى قواعدك وتحديثها، اتبع الخطوات الموضحة في إدارة قواعد أمان Firebase ونشرها .

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

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

سحابة فايرستور

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

قاعدة بيانات الوقت الحقيقي

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

سحابة التخزين

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

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

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

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

كافة المستخدمين المصادق عليهم

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

سحابة فايرستور

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

قاعدة بيانات الوقت الحقيقي

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

سحابة التخزين

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

قواعد جاهزة للإنتاج

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

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

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

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

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

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

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

سحابة فايرستور

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

قاعدة بيانات الوقت الحقيقي

{
  "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"
      }
    }
  }
}

سحابة التخزين

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

الوصول العام والخاص المختلط

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

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

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

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

سحابة فايرستور

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow create: if request.auth.uid == request.resource.data.author_uid;
      allow update, delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}

قاعدة بيانات الوقت الحقيقي

{
// 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"
      }
    }
  }
}

سحابة التخزين

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

الوصول القائم على السمات وعلى الدور

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

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

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

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

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

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

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

سحابة فايرستور

تذكر أنه في أي وقت تتضمن قواعدك قراءة، مثل القواعد أدناه، ستتم محاسبتك على عملية قراءة في 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"
   }
  }
}

قاعدة بيانات الوقت الحقيقي

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

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

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

سحابة فايرستور

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an admin 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";
   }
  }
}

قاعدة بيانات الوقت الحقيقي

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

سحابة التخزين

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

سحابة فايرستور

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;
  }
}

قاعدة بيانات الوقت الحقيقي

{
  "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
      }
    }
  }
}

سحابة التخزين

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;
  }
}