Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

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

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

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

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

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

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

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

سحابة Firestore

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 هي الضمانة الوحيدة التي تمنع وصول المستخدمين الضارين. إن تحديد القواعد بشكل منفصل عن منطق المنتج له عدد من المزايا: العملاء ليسوا مسؤولين عن فرض الأمان ، ولن تؤثر تطبيقات عربات التي تجرها الدواب على بياناتك ، والأهم من ذلك ، أنك لا تعتمد على خادم وسيط لحماية البيانات من العالم.

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

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

سحابة Firestore

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

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

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

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

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

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

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

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

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

سحابة Firestore

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

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

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

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

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

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

سحابة Firestore

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.

سحابة 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"
   }
  }
}

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

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

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

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

سحابة Firestore

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

سحابة 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;
  }
}

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

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