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

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

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

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

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

عند إنشاء مثيل قاعدة البيانات أو تخزينها في وحدة تحكم Firebase، يمكنك اختيار ما إذا كانت قواعد الأمن Firebase بك تقييد الوصول إلى البيانات الخاصة بك (وضع مغلق) أو السماح بالوصول أي شخص (وضع الاختبار). في سحابة Firestore وقاعدة البيانات في الوقت الحقيقي، والقواعد الافتراضية لوضع مغلق تنفي الوصول إلى كافة المستخدمين. في 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;
    }
  }
}

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

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

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

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

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

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

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

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

سحابة 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 من الطلب مقابل البيانات من قاعدة البيانات أو البيانات الوصفية للملف لتأكيد الوصول أو رفضه.

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

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

لإعداد هذه القاعدة: في سحابة 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;
  }
}