از شرایط موجود در قوانین امنیتی ذخیره سازی فضای ابری Firebase استفاده کنید

این راهنما بر اساس نحو هسته از زبان قوانین فایربیس امنیت یاد بگیرند راهنمای به نشان می دهد چگونه برای اضافه کردن شرایط به قوانین فایربیس امنیت خود را برای ذخیره سازی ابر.

بلوک های اولیه ساختمانی ابر ذخیره سازی قوانین امنیتی این بیماری است. شرط یک عبارت بولی است که تعیین می کند که یک عملیات خاص باید مجاز یا رد شود. برای قوانین اساسی، با استفاده از true و false لیترال به عنوان شرایط prefectly خوبی کار می کند. اما قوانین امنیتی Firebase برای زبان ذخیره سازی ابری به شما امکان می دهد شرایط پیچیده تری بنویسید که می تواند:

  • احراز هویت کاربر را بررسی کنید
  • اعتبار داده های ورودی

احراز هویت

قوانین امنیتی Firebase برای ذخیره سازی ابری با احراز هویت Firebase ادغام می شود تا احراز هویت مبتنی بر کاربر قدرتمند را برای ذخیره سازی ابر ارائه دهد. این اجازه می دهد تا بر اساس ادعاهای توکن احراز هویت Firebase ، کنترل دسترسی دانه ای انجام شود.

هنگامی که یک تصدیق انجام یک درخواست کاربران در برابر ابر ذخیره سازی از request.auth متغیر با کاربر جمعیت uid ( request.auth.uid ) و همچنین ادعای فایربیس احراز هویت 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;
}

گروه خصوصی

یکی دیگر از موارد استفاده رایج ، اجازه دادن به مجوزهای گروهی روی یک شیء است ، مانند اجازه دادن به چند عضو تیم برای همکاری در یک سند مشترک. چندین روش برای انجام این کار وجود دارد:

  • نعنا فایربیس احراز هویت سفارشی رمز است که شامل اطلاعات اضافی در مورد یک عضو گروه (مانند یک ID گروه)
  • شامل اطلاعات گروه (مانند یک شناسه گروه و یا لیست مجاز 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 های ارسال شده به ابر ذخیره سازی. علاوه بر شناسه منحصر به فرد کاربر و ظرفیت ترابری فایربیس احراز هویت در request.auth شی به عنوان بالا توضیح داده، request متغیر حاوی مسیر فایل که در آن این درخواست از انجام، زمانی که درخواست دریافت، و جدید resource ارزش اگر درخواست نوشتن است هدرهای HTTP و وضعیت احراز هویت نیز گنجانده شده است.

request شی نیز شامل ID منحصر به فرد کاربر و محموله فایربیس احراز هویت در request.auth جسم، که شد بیشتر در توضیح داده خواهد شد مبتنی بر کاربر امنیت بخش از اسناد.

لیست کامل از خواص در request شی موجود به شرح زیر میباشد:

ویژگی تایپ کنید شرح
auth نقشه <رشته ، رشته> هنگامی که یک کاربر به سیستم وارد، فراهم می کند uid ، شناسه کاربر منحصر به فرد، و token ، یک نقشه از ادعاهای فایربیس احراز هویت JWT. در غیر این صورت، از آن خواهد شد null .
params نقشه <رشته ، رشته> نقشه حاوی پارامترهای پرس و جو درخواست است.
path مسیر path به نمایندگی از مسیر این درخواست از در انجام.
resource نقشه <رشته ، رشته> ارزش منابع جدید، در حال حاضر تنها در write درخواست.
time مهر زمان یک مهر زمانی نشان دهنده زمان سرور است که درخواست در آن ارزیابی می شود.

ارزیابی منابع

هنگام ارزیابی قوانین ، ممکن است بخواهید فراداده فایل بارگذاری شده ، بارگیری شده ، اصلاح شده یا حذف شده را نیز ارزیابی کنید. این به شما امکان می دهد قوانین پیچیده و قدرتمندی ایجاد کنید که کارهایی مانند فقط اجازه بارگذاری پرونده هایی با انواع خاصی از محتوا ، یا فقط حذف فایل های بزرگتر از اندازه خاص را می دهد.

فایربیس قوانین امنیتی برای ابر ذخیره سازی فراهم می کند ابرداده فایل در 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 .

اعتبار داده ها

فایربیس قوانین امنیتی برای ابر ذخیره سازی نیز می توان برای اعتبار سنجی داده ها از جمله اعتبار نام فایل و مسیر و همچنین خواص فایل ابرداده مانند استفاده می شود، 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 ، ممکن است بخواهید مجموعه ای از شرایط را در توابع که می توانید مجدداً در مجموعه قوانین خود استفاده کنید ، جمع کنید. قوانین امنیتی از عملکردهای سفارشی پشتیبانی می کند. نحو برای توابع سفارشی کمی شبیه به جاوا اسکریپت است ، اما توابع Firebase Security Rules به یک زبان مخصوص دامنه نوشته شده است که دارای محدودیت های مهمی است:

  • توابع می تواند شامل تنها یک return بیانیه. آنها نمی توانند منطق اضافی داشته باشند. به عنوان مثال ، آنها نمی توانند حلقه ها را اجرا کرده یا با خدمات خارجی تماس بگیرند.
  • توابع می توانند به طور خودکار از محدوده ای که در آن تعریف شده اند به توابع و متغیرها دسترسی پیدا کنند. به عنوان مثال، یک تابع تعریف شده در service firebase.storage دامنه دسترسی به است resource متغیر، و برای ابر Firestore تنها، ساخته شده در توابع مانند get() و exists() .
  • توابع ممکن است توابع دیگری را فراخوانی کنند اما ممکن است بازگردانده نشوند. کل عمق پشته تماس به 10 محدود شده است.
  • در نسخه rules2 ، توابع می توانید متغیرهای با استفاده از تعریف let کلمه کلیدی. توابع می توانند هر تعداد پیوند let داشته باشند ، اما باید با دستور return خاتمه یابد.

یک تابع است که با تعریف 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 شما با افزایش پیچیدگی قوانین شما ، آنها را بیشتر حفظ می کند.

مراحل بعدی

پس از این بحث شرایط ، شما درک پیچیده تری از قوانین پیدا کرده اید و آماده هستید:

نحوه مدیریت موارد استفاده اصلی را یاد بگیرید و گردش کار برای توسعه ، آزمایش و استقرار قوانین را بیاموزید: