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