استخدم الشروط في قواعد أمان Firebase Cloud Storage

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

اللبنة الأولي من الكلمة الدلالية ضوابط الأمن التخزين هو الشرط. الشرط هو تعبير منطقي يحدد ما إذا كان يجب السماح بعملية معينة أو رفضها. للقواعد الأساسية، وذلك باستخدام true و false الحرفية كشروط يعمل بشكل جيد بريفيكتلي. لكن قواعد أمان Firebase للغة التخزين السحابي تمنحك طرقًا لكتابة شروط أكثر تعقيدًا يمكنها:

  • تحقق من مصادقة المستخدم
  • تحقق من صحة البيانات الواردة

المصادقة

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

عندما يكون مصادقة ينفذ المستخدم طلب ضد سحابة التخزين، و request.auth يتم ملؤها المتغير مع المستخدم uid ( request.auth.uid ) فضلا عن مطالبات Firebase مصادقة JWT ( request.auth.token ).

بالإضافة إلى ذلك، عند استخدام المصادقة المخصصة، وظهرت مطالبات إضافية في request.auth.token المجال.

عندما يقوم مستخدم مصادق طلب، و request.auth المتغير هو null .

باستخدام هذه البيانات ، توجد عدة طرق شائعة لاستخدام المصادقة لتأمين الملفات:

  • الجمهور: تجاهل request.auth
  • مصادقة الخاص: الاختيار التي request.auth ليس null
  • المستخدم الخاص: الاختيار التي request.auth.uid يساوي مسار uid
  • مجموعة خاصة: تحقق من مطالبات الرمز المميز المخصص لمطابقة مطالبة محددة ، أو اقرأ البيانات الوصفية للملف لمعرفة ما إذا كان هناك حقل بيانات وصفية

عام

أي القاعدة التي لا تعتبر request.auth السياق يمكن اعتبار public الحكم، لأنه لا يعتبر سياق مصادقة المستخدم. يمكن أن تكون هذه القواعد مفيدة في عرض البيانات العامة مثل أصول اللعبة أو ملفات الصوت أو أي محتوى ثابت آخر.

// Anyone to read a public image if the file is less than 100kB
// Anyone can upload a public file ending in '.txt'
match /public/{imageId} {
  allow read: if resource.size < 100 * 1024;
  allow write: if imageId.matches(".*\\.txt");
}

مصدق خاص

في بعض الحالات ، قد ترغب في أن تكون البيانات قابلة للعرض من قبل جميع المستخدمين المصادق عليهم لتطبيقك ، ولكن ليس من قبل المستخدمين غير المصادق عليهم. منذ request.auth المتغير هو null لجميع المستخدمين مصادق، كل ما عليك القيام به هو مراجعة request.auth وجود متغير من أجل تتطلب مصادقة:

// Require authentication on all internal image reads
match /internal/{imageId} {
  allow read: if request.auth != null;
}

المستخدم خاص

حتى الآن معظم الحالات استخدام المشتركة لل request.auth سيكون لتزويد المستخدمين الفرديين الذين لديهم أذونات الحبيبية على ملفاتهم: من الصور الشخصية تحميلها على قراءة وثائق خاصة.

منذ الملفات في سحابة التخزين لديها "المسار" الكامل للملف، كل ما يتطلبه الأمر لجعل ملف يسيطر عليها المستخدم هو قطعة من المعلومات فريدة من نوعها، المستخدم تحديد في بادئة اسم الملف (مثل المستخدم uid ) التي يمكن أن يتم التحقق عند تقييم القاعدة:

// Only a user can upload their profile picture, but anyone can view it
match /users/{userId}/profilePicture.png {
  allow read;
  allow write: if request.auth.uid == userId;
}

مجموعة خاصة

هناك حالة استخدام أخرى شائعة وهي السماح بأذونات المجموعة على كائن ، مثل السماح للعديد من أعضاء الفريق بالتعاون في مستند مشترك. هناك عدة طرق للقيام بذلك:

  • النعناع مصادقة Firebase مخصصة المنوال الذي يحتوي على معلومات إضافية حول أحد أعضاء المجموعة (مثل معرف مجموعة)
  • تتضمن معلومات المجموعة (مثل معرف مجموعة أو قائمة من أذن uid ق) في ملف الفوقية

بمجرد تخزين هذه البيانات في الرمز المميز أو البيانات الوصفية للملف ، يمكن الرجوع إليها من داخل قاعدة:

// 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;
}

طلب التقييم

يتم تقييم تحميل، تنزيل، والتغيرات الوصفية، والحذف باستخدام request إرسالها إلى سحابة التخزين. بالإضافة إلى معرف فريد للمستخدم والحمولة مصادقة Firebase في request.auth الكائن كما هو موضح أعلاه، request يحتوي على متغير مسار الملف حيث يتم تنفيذ الطلب، وقت استلام الطلب، والجديد resource القيمة إذا الطلب كتابة. يتم أيضًا تضمين رؤوس HTTP وحالة المصادقة.

و request يحتوي الكائن على اسم مستخدم فريد المستخدم والحمولة مصادقة Firebase في request.auth الكائن، والذي سيتم شرحه في العضو المستندة الأمن قسم من مستندات.

قائمة كاملة من العقارات في request الكائن متاح أدناه:

ملكية يكتب وصف
auth الخريطة <سلسلة ، سلسلة> عندما يوفر للمستخدم بتسجيل الدخول، uid ، معرف فريد للمستخدم، و token خريطة المطالبات Firebase مصادقة JWT،. خلاف ذلك، سيكون null .
params الخريطة <سلسلة ، سلسلة> خريطة تحتوي على معامِلات طلب البحث للطلب.
path طريق A path يمثل المسار يتم تنفيذ الطلب في.
resource الخريطة <سلسلة ، سلسلة> قيمة الموارد الجديدة، يقدم فقط على write الطلبات.
time الطابع الزمني طابع زمني يمثل وقت تقييم الطلب على الخادم.

تقييم الموارد

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

قواعد الأمن Firebase لسحابة التخزين يوفر ملف الفوقية في resource الكائن، والذي يحتوي على مفتاح أزواج / قيمة البيانات الوصفية ظهرت في كائن سحابة التخزين. يمكن أن يتم فحص هذه الخصائص على read أو write طلبات لضمان سلامة البيانات.

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

قائمة كاملة من الخصائص في resource الكائن متاح أدناه:

ملكية يكتب وصف
name خيط الاسم الكامل للكائن
bucket خيط اسم المستودع الذي يتواجد فيه هذا الكائن.
generation int و الجيل الكائن جوجل سحابة التخزين من هذا الكائن.
metageneration int و metageneration الكائن جوجل سحابة التخزين من هذا الكائن.
size int حجم الكائن بالبايت.
timeCreated الطابع الزمني طابع زمني يمثل الوقت الذي تم فيه إنشاء كائن.
updated الطابع الزمني طابع زمني يمثل وقت آخر تحديث للعنصر.
md5Hash خيط تجزئة MD5 للكائن.
crc32c خيط تجزئة crc32c للكائن.
etag خيط etag المرتبطة بهذا الكائن.
contentDisposition خيط ترتيب المحتوى المرتبط بهذا الكائن.
contentEncoding خيط ترميز المحتوى المرتبط بهذا الكائن.
contentLanguage خيط لغة المحتوى المرتبطة بهذا الكائن.
contentType خيط نوع المحتوى المرتبط بهذا الكائن.
metadata الخريطة <سلسلة ، سلسلة> أزواج مفتاح / قيمة لبيانات وصفية مخصصة إضافية يحددها المطور.

request.resource يحتوي على كافة هذه باستثناء generation ، metageneration ، etag ، timeCreated ، و updated .

تحقق من صحة البيانات

قواعد الأمن Firebase لسحابة التخزين يمكن أن تستخدم أيضا للتحقق من صحة البيانات، بما في ذلك التحقق من صحة اسم الملف والمسار وكذلك خصائص ملف الفوقية مثل contentType و size .

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      // Only allow uploads of any image file that's less than 5MB
      allow write: if request.resource.size < 5 * 1024 * 1024
                   && request.resource.contentType.matches('image/.*');
    }
  }
}

وظائف مخصصة

نظرًا لأن قواعد أمان Firebase أصبحت أكثر تعقيدًا ، فقد ترغب في التفاف مجموعات من الشروط في وظائف يمكنك إعادة استخدامها عبر مجموعة القواعد الخاصة بك. قواعد الأمان تدعم الوظائف المخصصة. يشبه بناء جملة الوظائف المخصصة JavaScript إلى حد ما ، لكن وظائف قواعد أمان Firebase مكتوبة بلغة خاصة بالمجال لها بعض القيود المهمة:

  • يمكن أن تحتوي وظائف واحد فقط return البيان. لا يمكن أن تحتوي على أي منطق إضافي. على سبيل المثال ، لا يمكنهم تنفيذ حلقات أو استدعاء خدمات خارجية.
  • يمكن للوظائف الوصول تلقائيًا إلى الوظائف والمتغيرات من النطاق الذي تم تعريفها فيه. على سبيل المثال، وهي وظيفة محددة داخل service firebase.storage نطاق لديه حق الوصول إلى resource متغير، والغيمة Firestore فقط، المدمج في وظائف مثل get() و exists() .
  • قد تستدعي الوظائف وظائف أخرى ولكنها قد لا تتكرر. إجمالي عمق مكدس الاستدعاء محدد بـ 10.
  • في الإصدار rules2 ، يمكن تحديد وظائف المتغيرات باستخدام let الكلمة. يمكن أن تحتوي الدوال على أي عدد من ارتباطات let ، ولكن يجب أن تنتهي ببيان إرجاع.

يتم تعريف وظيفة مع function الكلمة ويأخذ الحجج صفر أو أكثر. على سبيل المثال ، قد ترغب في الجمع بين نوعي الشروط المستخدمة في الأمثلة أعلاه في دالة واحدة:

service firebase.storage {
  match /b/{bucket}/o {
    // True if the user is signed in or the requested data is 'public'
    function signedInOrPublic() {
      return request.auth.uid != null || resource.data.visibility == 'public';
    }
    match /images/{imageId} {
      allow read, write: if signedInOrPublic();
    }
    match /mp3s/{mp3Ids} {
      allow read: if signedInOrPublic();
    }
  }
}

يؤدي استخدام الوظائف في قواعد أمان Firebase إلى جعلها أكثر قابلية للصيانة مع تزايد تعقيد قواعدك.

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

بعد هذه المناقشة حول الشروط ، لديك فهم أكثر تعقيدًا للقواعد وأنت مستعد لما يلي:

تعرف على كيفية التعامل مع حالات الاستخدام الأساسية ، وتعلم سير العمل لتطوير واختبار ونشر القواعد: