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 یکپارچه کنیم.