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

تسمح لك قواعد أمان 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

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