تسمح لك قواعد أمان Firebase للتخزين السحابي بالتحكم في الوصول إلى الكائنات المخزنة في حاويات التخزين السحابي. تسمح لك بنية القواعد المرنة بإنشاء قواعد للتحكم في أي عملية ، بدءًا من جميع عمليات الكتابة إلى حاوية التخزين السحابي الخاصة بك وحتى العمليات في ملف معين.
يصف هذا الدليل البنية الأساسية وهيكل قواعد أمان التخزين السحابي لإنشاء مجموعات قواعد كاملة.
إعلان الخدمة وقاعدة البيانات
تبدأ قواعد أمان Firebase للتخزين السحابي دائمًا بالإعلان التالي:
service firebase.storage {
// ...
}
يحدد إعلان service firebase.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}
.
في المثال أعلاه ، تستخدم جملة match صيغة حرف البدل {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/
stem. تنطبق قواعد أمان Firebase فقط على اسم الملف المطابق ، لذلك لا تنطبق عناصر التحكم في الوصول المحددة في /images/
stem على /mp3s/
stem. بدلاً من ذلك ، اكتب قواعد صريحة تتطابق مع أنماط أسماء الملفات المختلفة:
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 الخاصة بـ Cloud Storage: