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

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

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

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

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

service firebase.storage {
    // ...
}

في service firebase.storage نطاقات إعلان القواعد لسحابة التخزين، ومنع الصراعات بين الكلمة الدلالية ضوابط الأمن التخزين وقواعد لمنتجات أخرى مثل الغيمة 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 .

تطابق أحرف البدل

في additiont لافتا إلى ملف واحد، يمكن أن قواعد استخدام أحرف البدل للإشارة إلى أي ملف مع بادئة سلسلة معينة في اسمها، بما في ذلك خطوط مائلة، كما هو الحال في 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 من نتيجة جميع التقييمات القواعد. وهذا هو، إذا أي حكم الملف مباريات evalutes إلى true ، والنتيجة هي true .

في القواعد المذكورة أعلاه، فإن "الصور / profilePhoto.png" ملف يمكن قراءة إذا كان أي condition أو other_condition تقييم إلى true، في حين أن ملف "صور / المستخدمين / المستخدم: 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 في عمليات أكثر دقة. على سبيل المثال ، قد يرغب تطبيقك في فرض شروط مختلفة على إنشاء الملف عن تلك المفروضة على حذف الملف.

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

A 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 document 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 nonexistent files
      allow create: if <condition>;

      // Applies to updates to 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 any filename containing string '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches all filenames containing string `/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 الخاصة بـ Cloud Storage: