تعرف على البنية الأساسية لقواعد أمان Firebase للغة التخزين السحابي

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

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

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

تبدأ قواعد أمان Firebase للتخزين السحابي دائمًا بالإعلان التالي:

service firebase.storage {
    // ...
}

يقوم إعلان service firebase.storage بنطاق القواعد على Cloud Storage، مما يمنع التعارضات بين قواعد أمان Cloud Storage وقواعد المنتجات الأخرى مثل Cloud Firestore.

قواعد القراءة والكتابة الأساسية

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

في مجموعة القواعد الافتراضية الخاصة بك، تستخدم عبارة match الأولى تعبير حرف البدل {bucket} للإشارة إلى القواعد التي تنطبق على جميع المجموعات في مشروعك. سنناقش فكرة تطابقات أحرف البدل بشكل أكبر في القسم التالي.

service firebase.storage {
  // The {bucket} wildcard indicates we match files in all Cloud Storage buckets
  match /b/{bucket}/o {
    // Match filename
    match /filename {
      allow read: if <condition>;
      allow write: if <condition>;
    }
  }
}

تشير جميع بيانات المطابقة إلى الملفات. يمكن أن تشير عبارة المطابقة إلى ملف محدد، كما في match /images/profilePhoto.png .

مطابقة أحرف البدل

بالإضافة إلى الإشارة إلى ملف واحد، يمكن للقواعد استخدام أحرف البدل للإشارة إلى أي ملف ببادئة سلسلة معينة في اسمه، بما في ذلك الشرطة المائلة، كما في match /images/{imageId} .

في المثال أعلاه، تستخدم عبارة المطابقة صيغة حرف البدل {imageId} . وهذا يعني أن القاعدة تنطبق على أي ملف يحتوي على /images/ في بداية اسمه، مثل /images/profilePhoto.png أو /images/croppedProfilePhoto.png . عندما يتم تقييم تعبيرات allow في عبارة المطابقة، سيتم تحويل متغير imageId إلى اسم ملف الصورة، مثل profilePhoto.png أو croppedProfilePhoto.png .

يمكن الإشارة إلى متغير بدل من داخل match لتوفير اسم الملف أو ترخيص المسار:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

البيانات الهرمية

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

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

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      allow read, write: if <condition>;
    }

    // Explicitly define rules for the 'mp3s' pattern
    match /mp3s/{mp3Id} {
      allow read, write: if <condition>;
    }
  }
}

عند تداخل عبارات match ، يتم دائمًا إلحاق مسار عبارة match الداخلية بمسار عبارة match الخارجية. وبالتالي فإن مجموعتي القواعد التاليتين متكافئتين:

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Exact match for "images/profilePhoto.png"
      match /profilePhoto.png {
        allow write: if <condition>;
      }
    }
  }
}
service firebase.storage {
  match /b/{bucket}/o {
    // Exact match for "images/profilePhoto.png"
    match /images/profilePhoto.png {
      allow write: if <condition>;
      }
  }
}

أحرف البدل المطابقة العودية

بالإضافة إلى أحرف البدل التي تطابق السلاسل وترجعها في نهاية اسم الملف، يمكن الإعلان عن أحرف بدل متعددة المقاطع لمطابقة أكثر تعقيدًا عن طريق إضافة =** إلى اسم حرف البدل، مثل {path=**} :

// Partial match for files that start with "images"
match /images {

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

إذا تطابقت قواعد متعددة مع ملف ما، فإن النتيجة هي OR نتيجة جميع تقييمات القواعد. أي أنه إذا تم تقييم أي قاعدة يطابقها الملف إلى true ، فإن النتيجة تكون true .

في القواعد المذكورة أعلاه، يمكن قراءة الملف "images/profilePhoto.png" إذا تم تقييم أي من condition أو other_condition على أنها صحيحة، في حين أن الملف "images/users/user:12345/profilePhoto.png" يخضع فقط لنتيجة other_condition .

لا تتتالي قواعد أمان التخزين السحابي، ويتم تقييم القواعد فقط عندما يتطابق مسار الطلب مع مسار بقواعد محددة.

النسخة 1

تستخدم قواعد أمان Firebase الإصدار 1 افتراضيًا. في الإصدار 1، تتطابق أحرف البدل العودية مع عنصر واحد أو أكثر من عناصر اسم الملف، وليس صفرًا أو أكثر من العناصر. ومن ثم، match /images/{filenamePrefixWildcard}/{imageFilename=**} تتطابق مع اسم ملف مثل /images/profilePics/profile.png، ولكن ليس /images/badge.png. استخدم /images/{imagePrefixorFilename=**} بدلاً من ذلك.

يجب أن تأتي أحرف البدل العودية في نهاية بيان المطابقة.

ننصحك باستخدام الإصدار 2 لميزاته الأكثر قوة.

الإصدار 2

في الإصدار 2 من قواعد أمان Firebase، تتطابق أحرف البدل العودية مع صفر أو أكثر من عناصر المسار. وبالتالي، فإن /images/{filenamePrefixWildcard}/{imageFilename=**} يطابق أسماء الملفات /images/profilePics/profile.png و /images/badge.png.

يجب عليك الاشتراك في الإصدار 2 عن طريق إضافة rules_version = '2'; في الجزء العلوي من قواعد الأمان الخاصة بك:

rules_version = '2';
service cloud.storage {
  match /b/{bucket}/o {
   ...
 }
}

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

rules_version = '2';
service firebase.storage {
 match /b/{bucket}/o {
   // Matches any file in a songs "subdirectory" under the
   // top level of your Cloud Storage bucket.
   match /{prefixSegment=**}/songs/{mp3filenames} {
     allow read, write: if <condition>;
   }
  }
}

العمليات الحبيبية

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

يمكن تقسيم عملية read إلى get و list .

يمكن تقسيم قاعدة write إلى create update delete :

service firebase.storage {
  match /b/{bucket}/o {
    // A read rule can be divided into read and list rules
    match /images/{imageId} {
      // Applies to single file read requests
      allow get: if <condition>;
      // Applies to list and listAll requests (Rules Version 2)
      allow list: if <condition>;

    // A write rule can be divided into create, update, and delete rules
    match /images/{imageId} {
      // Applies to writes to file contents
      allow create: if <condition>;

      // Applies to updates to (pre-existing) file metadata
      allow update: if <condition>;

      // Applies to delete operations
      allow delete: if <condition>;
    }
  }
 }
}

تداخل بيانات المباراة

من الممكن أن يتطابق اسم الملف مع أكثر من بيان match واحد. في حالة تطابق تعبيرات allow المتعددة مع الطلب، يُسمح بالوصول إذا true أي من الشروط:

service firebase.storage {
  match b/{bucket}/o {
    // Matches file names directly inside of '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches file names anywhere under `/images/`
    match /images/{imageId=**} {
      allow read, write: if true;
    }
  }
}

في المثال أعلاه، جميع عمليات القراءة والكتابة للملفات التي يبدأ اسمها بـ /images/ مسموح بها لأن القاعدة الثانية true دائمًا، حتى عندما تكون القاعدة الأولى false .

القواعد ليست مرشحات

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

على سبيل المثال، خذ قاعدة الأمان التالية:

service firebase.storage {
  match /b/{bucket}/o {
    // Allow the client to read files with contentType 'image/png'
    match /aFileNamePrefix/{aFileName} {
      allow read: if resource.contentType == 'image/png';
    }
  }
}

مرفوض : ترفض هذه القاعدة الطلب التالي لأن مجموعة النتائج يمكن أن تتضمن ملفات حيث contentType ليس image/png :

ويب
filesRef = storage.ref().child("aFilenamePrefix");

filesRef.listAll()
    .then(function(result) {
      console.log("Success: ", result.items);
    })
});

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

الخطوات التالية

يمكنك تعميق فهمك لقواعد أمان Firebase للتخزين السحابي:

  • تعرف على المفهوم الرئيسي التالي للغة القواعد، والشروط الديناميكية، التي تتيح لقواعدك التحقق من ترخيص المستخدم، ومقارنة البيانات الحالية والواردة، والتحقق من صحة البيانات الواردة، والمزيد.

  • قم بمراجعة حالات الاستخدام الأمني ​​النموذجية وتعريفات قواعد أمان Firebase التي تتناولها .

يمكنك استكشاف حالات استخدام قواعد أمان Firebase الخاصة بالتخزين السحابي: