Cloud Storage for Firebase یک مدل امنیتی مبتنی بر مسیر به نام Firebase Security Rules برای Cloud Storage ارائه میکند که به شما امکان میدهد به سرعت و به راحتی فایلهای خود را ایمن کنید.
قوانین را درک کنید
Firebase Security Rules برای Cloud Storage برای تعیین اینکه چه کسی به فایلهای ذخیرهشده در Cloud Storage دسترسی خواندن و نوشتن دارد، و همچنین نحوه ساختار فایلها و حاوی چه متادیتاهایی استفاده میشود. نوع اصلی قانون، قانون allow است که به درخواستهای read و write اجازه میدهد اگر یک شرط اختیاری مشخص شده باشد، برای مثال:
// If no condition is specified, the rule evaluates to true allow read; // Rules can optionally specify a condition allow write: if <condition>; // Rules can also specify multiple request methods allow read, write: if <condition>;
مسیرهای تطبیق
Cloud Storage Security Rules با مسیرهای فایل مورد استفاده برای دسترسی به فایلها در Cloud Storage match . قوانین می توانند دقیقاً با مسیرها یا مسیرهای عام match و قوانین نیز می توانند تودرتو باشند. اگر هیچ قانون تطبیقی اجازه یک روش درخواست را نمی دهد، یا شرط به false ارزیابی می شود، درخواست رد می شود.
مطابقت دقیق
// Exact match for "images/profilePhoto.png" match /images/profilePhoto.png { allow write: if <condition>; } // Exact match for "images/croppedProfilePhoto.png" match /images/croppedProfilePhoto.png { allow write: if <other_condition>; }
مسابقات تو در تو
// Partial match for files that start with "images" match /images { // Exact match for "images/profilePhoto.png" match /profilePhoto.png { allow write: if <condition>; } // Exact match for "images/croppedProfilePhoto.png" match /croppedProfilePhoto.png { allow write: if <other_condition>; } }
منطبق با حروف عامیانه
قوانین همچنین می توانند برای match یک الگو با استفاده از حروف عام استفاده شوند. عام یک متغیر با نام است که یا یک رشته منفرد مانند profilePhoto.png یا بخش های مسیر متعدد مانند images/profilePhoto.png را نشان می دهد.
یک علامت عام با افزودن پرانتزهای فرفری در اطراف نام عام، مانند {string} ایجاد میشود. با افزودن =** به نام عام میتوان یک علامت عام بخش چندگانه، مانند {path=**} را اعلام کرد:
// Partial match for files that start with "images" match /images { // Exact match for "images/*" // e.g. images/profilePhoto.png is matched match /{imageId} { // This rule only matches a single path segment (*) // imageId is a string that contains the specific segment matched allow read: if <condition>; } // 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 است. .
یک متغیر wildcard را می توان از داخل match نام فایل یا مجوز مسیر ارجاع داد:
// Another way to restrict the name of a file match /images/{imageId} { allow read: if imageId == "profilePhoto.png"; }
Cloud Storage Security Rules آبشاری نمی شوند و قوانین تنها زمانی ارزیابی می شوند که مسیر درخواست با مسیری با قوانین مشخص شده مطابقت داشته باشد.
درخواست ارزیابی
بارگذاریها، بارگیریها، تغییرات فراداده، و حذفها با استفاده از request ارسال شده به Cloud Storage ارزیابی میشوند. متغیر request شامل مسیر فایلی است که درخواست در آن انجام می شود، زمان دریافت درخواست و مقدار resource جدید اگر درخواست یک نوشتن باشد. هدرهای HTTP و وضعیت احراز هویت نیز گنجانده شده است.
شی request همچنین شامل شناسه منحصر به فرد کاربر و بارگذاری Firebase Authentication در شی request.auth است که در بخش امنیت مبتنی بر کاربر اسناد بیشتر توضیح داده خواهد شد.
لیست کاملی از خواص در شی request در زیر موجود است:
| اموال | تایپ کنید | توضیحات |
|---|---|---|
auth | نقشه<رشته، رشته> | زمانی که کاربر وارد سیستم میشود، uid ، شناسه منحصربهفرد کاربر، و token ، نقشهای از Firebase Authentication JWT را ارائه میکند. در غیر این صورت null خواهد شد. |
params | نقشه<رشته، رشته> | نقشه حاوی پارامترهای پرس و جو درخواست. |
path | مسیر | path نشان دهنده مسیری است که درخواست در آن انجام می شود. |
resource | نقشه<رشته، رشته> | مقدار منبع جدید، فقط در درخواستهای write وجود دارد. |
time | مهر زمانی | یک مهر زمانی که نشان دهنده زمان ارزیابی درخواست سرور است. |
ارزیابی منابع
هنگام ارزیابی قوانین، ممکن است بخواهید فراداده فایل در حال آپلود، دانلود، اصلاح یا حذف را نیز ارزیابی کنید. این به شما امکان میدهد قوانین پیچیده و قدرتمندی ایجاد کنید که کارهایی مانند فقط اجازه میدهد فایلهایی با انواع محتوای خاص آپلود شوند یا فقط فایلهای بزرگتر از اندازه معین حذف شوند.
Firebase Security Rules برای Cloud Storage ، ابردادههای فایل را در شی resource ارائه میکند، که شامل جفتهای کلید/مقدار از ابردادههای ظاهر شده در یک شی Cloud Storage است. این ویژگی ها را می توان در درخواست های read یا write برای اطمینان از یکپارچگی داده ها بررسی کرد.
در درخواستهای write (مانند آپلود، بهروزرسانی فراداده و حذف)، علاوه بر شی resource ، که حاوی فراداده فایل برای فایلی است که در حال حاضر در مسیر درخواست وجود دارد، شما همچنین میتوانید از شی request.resource استفاده کنید. که حاوی زیرمجموعه ای از فراداده فایل است که در صورت مجاز بودن نوشتن نوشته می شود. می توانید از این دو مقدار برای اطمینان از یکپارچگی داده ها یا اعمال محدودیت های برنامه مانند نوع یا اندازه فایل استفاده کنید.
لیست کاملی از خواص در شی resource در زیر موجود است:
| اموال | تایپ کنید | توضیحات |
|---|---|---|
name | رشته | نام کامل شی |
bucket | رشته | نام سطلی که این شی در آن قرار دارد. |
generation | بین المللی | تولید شی GCS این شی. |
metageneration | بین المللی | متا تولید شی GCS این شی. |
size | بین المللی | اندازه شی در بایت. |
timeCreated | مهر زمانی | مهر زمانی که نشان دهنده زمان ایجاد یک شی است. |
updated | مهر زمانی | مهر زمانی که نشاندهنده زمان آخرین بهروزرسانی یک شی است. |
md5Hash | رشته | هش MD5 از شی. |
crc32c | رشته | یک هش crc32c از شی. |
etag | رشته | تگ مرتبط با این شی. |
contentDisposition | رشته | محتوای محتوای مرتبط با این شی. |
contentEncoding | رشته | رمزگذاری محتوای مرتبط با این شی. |
contentLanguage | رشته | زبان محتوای مرتبط با این شی. |
contentType | رشته | نوع محتوای مرتبط با این شی. |
metadata | نقشه<رشته، رشته> | جفت کلید/مقدار متادیتای سفارشی اضافی و مشخص شده توسط توسعه دهنده. |
request.resource شامل همه اینها به استثنای generation , metageneration , etag , timeCreated و updated .
مثال کامل
با کنار هم قرار دادن همه آنها، می توانید یک مثال کامل از قوانین برای راه حل ذخیره سازی تصویر ایجاد کنید:
service firebase.storage { match /b/{bucket}/o { match /images { // Cascade read to any image type at any path match /{allImages=**} { allow read; } // Allow write files to the path "images/*", subject to the constraints: // 1) File is less than 5MB // 2) Content type is an image // 3) Uploaded content type matches existing content type (if it exists) // 4) File name (stored in imageId wildcard variable) is less than 32 characters match /{imageId} { allow write: if request.resource.size < 5 * 1024 * 1024 && request.resource.contentType.matches('image/.*') && (resource == null || request.resource.contentType == resource.contentType) && imageId.size() < 32 } } } }
اکنون اجازه دهید Firebase Authentication برای دسترسی به فایل به ازای هر کاربر در بخش User Security یکپارچه کنیم.