قوانین امنیتی Firebase برای مرجع ذخیره سازی ابری

قوانین امنیتی Firebase برای ذخیره‌سازی ابری برای تعیین اینکه چه کسی به فایل‌های ذخیره‌شده در Cloud Storage دسترسی خواندن و نوشتن دارد، و همچنین نحوه ساختار فایل‌ها و حاوی چه متادیتاهایی استفاده می‌شود. قوانین امنیتی Cloud Storage از قوانینی تشکیل شده است که request و resource برای اجازه یا رد یک عمل دلخواه، مانند آپلود یک فایل یا بازیابی فراداده فایل، در نظر می گیرند. این اسناد مرجع انواع قوانین، ویژگی‌های یک request و یک resource ، انواع داده‌های استفاده شده توسط قوانین امنیتی فضای ذخیره‌سازی ابری و نحوه رخ دادن خطاها را پوشش می‌دهند.

قانون

یک rule عبارتی است که برای تعیین اینکه آیا یک request مجاز به انجام یک عمل دلخواه است یا خیر ارزیابی می شود.

انواع

اجازه

قوانین allow شامل یک روش، مانند read یا write ، و همچنین یک شرط اختیاری است. هنگامی که یک قانون اجرا می شود، شرط ارزیابی می شود و اگر شرط به true ارزیابی شود، روش مورد نظر مجاز است. در غیر این صورت، روش رد می شود. یک قانون allow بدون شرط همیشه به روش مورد نظر اجازه می دهد.

// Always allow method
allow <method>;

// Allow method if condition is true
allow <method>: if <condition>;

در حال حاضر، allow تنها نوع قانون پشتیبانی شده است.

روش های درخواست

خواندن

روش read همه درخواست‌هایی را که در آن داده‌های فایل یا ابرداده خوانده می‌شود، شامل دانلود فایل و خوانده‌های فراداده فایل، پوشش می‌دهد.

// Always allow reads
allow read;

// Allow reads if condition evaluates to true
allow read: if <condition>;

نوشتن

روش write همه درخواست‌هایی را که در آن داده‌های فایل یا ابرداده نوشته می‌شود، شامل آپلود فایل، حذف فایل و به‌روزرسانی ابرداده فایل پوشش می‌دهد.

// Always allow writes
allow write;

// Allow writes if condition evaluates to true
allow write: if <condition>;

همخوانی داشتن

قوانین زمانی اجرا می شوند که request کاربر (مانند آپلود یا دانلود فایل) با یک مسیر فایل تحت پوشش یک قانون مطابقت داشته باشد. یک match شامل یک مسیر و یک بدنه است که باید حداقل یک قانون allow داشته باشد. اگر هیچ مسیری مطابقت نداشته باشد، درخواست رد می شود.

می‌توانید یک مسیر کاملاً نام‌گذاری شده را match ، یا می‌توانید علامت‌های عام را برای مطابقت با همه مسیرهایی که با یک الگوی خاص مطابقت دارند وارد کنید.

بخش های مسیر

single_segment

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

// Allow read at "path" if condition evaluates to true
match /path {
  allow read: if <condition>;
}

چندین بخش مسیر و مسیرهای تودرتو نیز مجاز هستند:

// Allow read at "path/to/object" if condition evaluates to true
match /path {
  match /to {
    match /object {
      allow read: if <condition>;
    }
  }
}

{single_segment_wildcard}

اگر می‌خواهید یک قاعده را برای چندین فایل در یک مسیر اعمال کنید، می‌توانید از یک بخش مسیر برای مطابقت با همه فایل‌ها در یک مسیر خاص استفاده کنید. یک متغیر wildcard در یک مسیر با قرار دادن یک متغیر در پرانتزهای فرفری اعلام می‌شود: {variable} . این متغیر در دستور match به عنوان یک string قابل دسترسی است.

// Allow read at any path "/*", if condition evaluates to true
match /{single_path} {
  // Matches "path", "to", or "object" but not "path/to/object"
  allow read: if <condition>;
}

بخش‌های چندگانه مسیر و مسیرهای تودرتو نیز ممکن است دارای حروف عام باشند:

// Allow read at any path "/path/*/newPath/*", if condition evaluates to true
match /path/{first_wildcard} {
  match /newPath/{second_wildcard} {
    // Matches "path/to/newPath/newObject" or "path/from/newPath/oldObject"
    allow read: if <condition>;
  }
}

{multi_segment_wildcard=**}

اگر می‌خواهید هر تعداد از بخش‌های مسیر را در یک مسیر یا زیر آن مطابقت دهید، می‌توانید از یک علامت عام چند بخش استفاده کنید، که همه درخواست‌ها را به مکان و زیر آن مطابقت می‌دهد. این می‌تواند برای ارائه فضای ذخیره‌سازی فرم رایگان به کاربر، یا ایجاد قوانینی که با بخش‌های مختلف مسیر مطابقت دارند (مانند ایجاد مجموعه‌ای از فایل‌های قابل خواندن برای عموم، یا نیاز به احراز هویت برای همه نوشته‌ها) مفید باشد.

یک مسیر عام چند بخش به طور مشابه با یک علامت عام بخش منفرد، با اضافه کردن =** در انتهای متغیر اعلام می شود: {variable=**} . یک متغیر wildcard چند بخش در دستور match به عنوان یک شی path موجود است.

// Allow read at any path "/**", if condition evaluates to true
match /{multi_path=**} {
  // Matches anything at or below this, from "path", "path/to", "path/to/object", ...
  allow read: if <condition>;
}

درخواست

متغیر request در یک شرط برای نشان دادن درخواستی که در آن مسیر انجام می شود ارائه می شود. متغیر request دارای تعدادی ویژگی است که می توان از آنها برای تصمیم گیری در مورد اجازه دادن به درخواست ورودی استفاده کرد.

خواص

auth

هنگامی که یک کاربر احراز هویت درخواستی را علیه فضای ذخیره سازی ابری انجام می دهد، متغیر auth با uid کاربر ( request.auth.uid ) و همچنین ادعاهای Firebase Authentication JWT ( request.auth.token ) پر می شود.

request.auth.token حاوی برخی یا همه کلیدهای زیر است:

رشته شرح
email آدرس ایمیل مرتبط با حساب، در صورت وجود.
email_verified true اگر کاربر تأیید کرده باشد که به آدرس email دسترسی دارد. برخی از ارائه دهندگان به طور خودکار آدرس های ایمیل خود را تأیید می کنند.
phone_number شماره تلفن مرتبط با حساب، در صورت وجود.
name نام نمایشی کاربر، در صورت تنظیم.
sub UID Firebase کاربر. این در یک پروژه منحصر به فرد است.
firebase.identities فرهنگ لغت همه هویت هایی که با حساب این کاربر مرتبط هستند. کلیدهای فرهنگ لغت می توانند یکی از موارد زیر باشند: email ، phone ، google.com ، facebook.com ، github.com ، twitter.com . مقادیر فرهنگ لغت آرایه‌هایی از شناسه‌های منحصربه‌فرد برای هر ارائه‌دهنده هویت مرتبط با حساب است. برای مثال، auth.token.firebase.identities["google.com"][0] حاوی اولین شناسه کاربری Google مرتبط با حساب است.
firebase.sign_in_provider ارائه‌دهنده ورود به سیستم برای دریافت این رمز استفاده می‌کند. می تواند یکی از رشته های زیر باشد: custom ، password ، phone ، anonymous ، google.com ، facebook.com ، github.com ، twitter.com .
firebase.tenant شناسه مستاجر مرتبط با حساب، در صورت وجود. به عنوان مثال tenant2-m6tyz

اگر از احراز هویت سفارشی استفاده می کنید، request.auth.token همچنین حاوی هر گونه ادعای سفارشی مشخص شده توسط توسعه دهنده است.

هنگامی که یک کاربر احراز هویت نشده درخواستی را انجام می دهد، request.auth null است.

// Allow requests from authenticated users
allow read, write: if request.auth != null;

path

متغیر path حاوی مسیری است که یک request در برابر آن انجام می شود.

// Allow a request if the first path segment equals "images"
allow read, write: if request.path[0] == 'images';

resource

متغیر resource حاوی فراداده یک فایل در حال آپلود یا ابرداده به روز شده برای یک فایل موجود است. این مربوط به متغیر resource است که بر خلاف ابرداده جدید حاوی فراداده فایل فعلی در مسیر درخواستی است.

// Allow a request if the new value is smaller than 5MB
allow read, write: if request.resource.size < 5 * 1024 * 1024;

request.resource دارای ویژگی های زیر از resource است:

ویژگی
name
bucket
metadata
size
contentType

time

متغیر time حاوی یک مهر زمانی است که نشان دهنده زمان فعلی سرور در حال ارزیابی درخواست است. می‌توانید از این برای دسترسی مبتنی بر زمان به فایل‌ها استفاده کنید، مانند: فقط اجازه می‌دهد فایل‌ها تا تاریخ معینی آپلود شوند، یا اجازه می‌دهند فایل‌ها فقط تا یک ساعت پس از آپلود خوانده شوند.

// Allow a read if the file was created less than one hour ago
allow read: if request.time < resource.timeCreated + duration.value(1, 'h');

بسیاری از توابع برای نوشتن قوانین با استفاده از مهرهای زمانی و مدت زمان ارائه شده است.

منبع

متغیر resource حاوی فراداده فایل برای فایل‌های موجود در فضای ذخیره‌سازی ابری است، مانند نام فایل، اندازه، زمان ایجاد و ابرداده سفارشی.

خواص

name

رشته ای حاوی نام کامل فایل، شامل مسیر فایل.

// Allow reads if the resource name is "path/to/object"
allow read: if resource.name == 'path/to/object'

bucket

رشته ای حاوی سطل Google Cloud Storage این فایل در آن ذخیره می شود.

// Allow reads of all resources in your bucket
allow read: if resource.bucket == '<your-cloud-storage-bucket>'

generation

یک int حاوی تولید شیء Google Cloud Storage از فایل. برای نسخه سازی اشیا استفاده می شود.

// Allow reads if the resource matches a known object version
allow read: if resource.generation == <known-generation>

metageneration

یک int حاوی ابرتولید شیء Google Cloud Storage از فایل. برای نسخه سازی اشیا استفاده می شود.

// Allow reads if the resource matches a known object metadata version
allow read: if resource.metageneration == <known-generation>

size

یک int حاوی اندازه فایل بر حسب بایت.

// Allow reads if the resource is less than 10 MB
allow read: if resource.size < 10 * 1024 * 1024;

timeCreated

یک مهر زمانی که نشان دهنده زمان ایجاد فایل است.

// Allow reads if the resource was created less than an hour ago
allow read: if resource.timeCreated < request.time + duration.value(60, "m")

updated

یک مهر زمانی که نشان دهنده آخرین به روز رسانی فایل است.

// Allow reads if the resource was updated less than an hour ago
allow read: if resource.updated < request.time + duration.value(60, "m")

md5Hash

رشته ای حاوی هش MD5 فایل.

// Allow writes if the hash of the uploaded file is the same as the existing file
allow write: if request.resource.md5Hash == resource.md5Hash;

crc32c

رشته ای حاوی هش crc32c فایل.

// Allow writes if the hash of the uploaded file is the same as the existing file
allow write: if request.resource.crc32c == resource.crc32c;

etag

رشته ای که حاوی تگ فایل است.

// Allow writes if the etag matches a known object etag
allow write: if resource.etag == <known-generation>

contentDisposition

رشته ای که حاوی محتوای فایل است.

// Allow reads if the content disposition matches a certain value
allow read: if resource.contentDisposition == 'inlined';

contentEncoding

رشته ای که حاوی کدگذاری محتوای فایل است.

// Allow reads if the content is encoded with gzip
allow read: if resource.contentEncoding == 'gzip';

contentLanguage

رشته ای که حاوی زبان محتوای فایل است.

// Allow reads if the content language is Japanese
allow read: if resource.contentLanguage == 'ja';

contentType

رشته ای که حاوی نوع محتوای فایل است.

// Allow reads if the content type is PNG.
allow read: if resource.contentType == 'image/png';

metadata

یک Map<String, String> حاوی فیلدهای فراداده توسط توسعه دهنده اضافی.

// Allow reads if a certain metadata field matches a desired value
allow read: if resource.metadata.customProperty == 'customValue';

firestore.get و firestore.exists

توابع firestore.get() و firestore.exists() به شما امکان می دهد به اسناد موجود در Cloud Firestore دسترسی داشته باشید تا معیارهای پیچیده مجوز را ارزیابی کنید.

توابع firestore.get() و firestore.exists() هر دو انتظار مسیرهای سند کاملاً مشخص را دارند. هنگام استفاده از متغیرها برای ساخت مسیرهایی برای firestore.get() و firestore.exists() ، باید به طور صریح از متغیرها با استفاده از دستور $(variable) فرار کنید.

firestore.get

محتویات یک سند Cloud Firestore را دریافت کنید.

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{club}/files/{fileId} {
      allow read: if club in
        firestore.get(/databases/(default)/documents/users/$(request.auth.uid)).data.memberships
    }
  }
}

firestore.وجود دارد

بررسی کنید که آیا سند Cloud Firestore وجود دارد یا خیر.

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{userId}/photos/{fileId} {
      allow read: if
        firestore.exists(/databases/(default)/documents/users/$(userId)/friends/$(request.auth.uid))
    }
  }
}

سرویس

این service اولین اعلان در فایل قوانین امنیتی فضای ذخیره سازی ابری است و مشخص می کند که این قوانین برای کدام سرویس اعمال می شود.

نام

name

نام قوانین خدمات اعمال خواهد شد. تنها مقدار فعلی firebase.storage است.

// Specify the service name
service firebase.storage {
  match /b/{bucket}/o {
    ...
  }
}

انواع داده ها

زبان Rules به شما امکان می دهد تا نوع را با استفاده از عملگر is بررسی کنید.

// For example
a is null
a is string

null

نوع داده null نشان دهنده مقداری است که وجود ندارد.

allow read: if request.auth != null;

bool

نوع bool یک مقدار true یا false بولی را نشان می دهد.

allow read: if true;   // always succeeds
allow write: if false; // always fails

مقایسه

مقادیر بولی را می توان با استفاده از عملگرهای == != مقایسه کرد.

عملیات بولی

عمل اصطلاح
AND x && y
OR x || y
NOT !x

عملیات اتصال کوتاه دارد و می تواند true ، false یا خطا را برگرداند.

allow read: if true || false;   // always succeeds, short circuits at true
allow write: if false && true; // always fails, short circuits at false

int و float

انواع int و float نشان دهنده اعداد هستند. اینت ها عبارتند از: 0 ، 1 ، -2 ، و غیره، در حالی که شناورها عبارتند از: 1.0 ، -2.0 ، 3.33 و غیره.

Intها مقادیر 64 بیتی امضا شده و شناورها مقادیر 64 بیتی مطابق با IEEE 754 هستند. مقادیر از نوع int هنگامی که در مقایسه ها و عملیات های حسابی با مقدار float استفاده می شوند، مجبور به float می شوند.

مقایسه

اینت ها و شناورها را می توان با استفاده از عملگرهای == ، != ، > ، < ، >= و <= مقایسه و مرتب کرد.

حسابی

اینت ها و شناورها را می توان جمع، تفریق، ضرب، تقسیم، مدول و نفی کرد:

عمل اصطلاح
اضافه شدن x + y
منها کردن x - y
ضرب x * y
بخش x / y
ماژول x % y
نفی -x

توابع ریاضی

قوانین امنیتی Firebase برای ذخیره سازی ابری همچنین تعدادی توابع کمکی ریاضی را برای ساده کردن عبارات ارائه می دهد:

تابع شرح
math.ceil(x) سقف مقدار عددی
math.floor(x) طبقه مقدار عددی
math.round(x) مقدار ورودی را به نزدیکترین int گرد کنید
math.abs(x) مقدار مطلق ورودی
math.isInfinite(x) تست کنید که آیا مقدار ±∞ باشد، یک bool برمی گرداند
math.isNaN(x) تست کنید که آیا مقدار یک عدد NaN نیست، یک bool برمی‌گرداند

string

مقایسه

رشته‌ها را می‌توان با استفاده از عملگرهای == ، != ، > ، < ، >= و <= مقایسه و مرتب کرد.

الحاق

رشته ها را می توان با استفاده از عملگر + به هم متصل کرد.

// Concatenate a file name and extension
'file' + '.txt'

شاخص و محدوده

عملگر index ، string[] ، رشته‌ای را برمی‌گرداند که حاوی کاراکتر در فهرست ارائه‌شده در رشته است.

// Allow reads of files that begin with 'a'
match /{fileName} {
  allow read: if fileName[0] == 'a';
}

عملگر range ، string[i:j] ، رشته‌ای را برمی‌گرداند که شامل کاراکترهای بین شاخص‌های مشخص شده، از i (شامل) تا j (انحصاری) است. اگر i یا j مشخص نشده باشد، به ترتیب 0 و اندازه رشته را به طور پیش فرض تعیین می کنند، اما حداقل i یا j باید برای معتبر بودن محدوده مشخص شود.

// Allow reads of files that begin with 'abcdef'
match /{fileName} {
  allow read: if fileName[0:6] == 'abcdef';
}

اگر شاخص‌های ارائه‌شده از محدوده‌های رشته فراتر بروند، عملگرهای index و range با خطا مواجه می‌شوند.

size

تعداد کاراکترهای رشته را برمی گرداند.

// Allow files with names less than 10 characters
match /{fileName} {
  allow write: if fileName.size() < 10;
}

matches

یک تطابق عبارت منظم را انجام می دهد، اگر رشته با عبارت منظم داده شده مطابقت داشته باشد، true را برمی گرداند. از نحو گوگل RE2 استفاده می کند.

// Allow writes to files which end in ".txt"
match /{fileName} {
  allow write: if fileName.matches('.*\\.txt')
}

split

یک رشته را طبق یک عبارت منظم ارائه شده تقسیم می کند و list از رشته ها را برمی گرداند. از نحو گوگل RE2 استفاده می کند.

// Allow files named "file.*" to be uploaded
match /{fileName} {
  allow write: if fileName.split('.*\\..*')[0] == 'file'
}

path

مسیرها اسامی دایرکتوری مانند با تطبیق الگوی اختیاری هستند. وجود یک اسلش رو به جلو / نشان دهنده شروع یک قطعه مسیر است.

path

آرگومان string را به path تبدیل می کند.

// Allow reads on a specific file path
match /{allFiles=**} {
  allow read: if allFiles == path('/path/to/file');
}

timestamp

مهرهای زمانی به UTC هستند، با مقادیر ممکن از 0001-01-01T00.00.00Z شروع و به 9999-12-31T23.59.59Z ختم می شود.

مقایسه

مهرهای زمانی را می توان با استفاده از عملگرهای == ، != ، > ، < ، >= و <= مقایسه و مرتب کرد.

حسابی

مهرهای زمانی از جمع و تفریق بین مهرهای زمانی و مدت‌ها به شرح زیر پشتیبانی می‌کنند:

اصطلاح نتیجه
timestamp + duration timestamp
duration + timestamp timestamp
timestamp - duration timestamp
timestamp - timestamp duration
duration + duration duration
duration - duration duration

date

یک مقدار timestamp که فقط شامل year ، month و day است.

// Allow reads on the same day that the resource was created.
allow read: if request.time.date() == resource.timeCreated.date()

year

ارزش سال به عنوان int، از 1 تا 9999.

// Allow reads on all requests made before 2017
allow read: if request.time.year() < 2017

month

مقدار ماه به عنوان int، از 1 تا 12.

// Allow reads on all requests made during the month of January
allow read: if request.time.month() == 1;

day

روز جاری ماه به عنوان یک int، از 1 تا 31.

// Allow reads on all requests made during the first day of each month
allow read: if request.time.day() == 1;

time

مقدار duration حاوی زمان جاری.

// Allow reads on all requests made before 12PM
allow read: if request.time.time() < duration.time(12, 0, 0, 0);

hours

ساعت ها به صورت int از 0 تا 23 ارزش دارند.

// Allow reads on all requests made before 12PM
allow read: if request.time.hours() < 12;

minutes

مقدار دقیقه به صورت int از 0 تا 59 است.

// Allow reads during even minutes of every hour
allow read: if request.time.minutes() % 2 == 0;

seconds

ثانیه ها به عنوان int از 0 تا 59 ارزش دارند.

// Allow reads during the second half of each minute
allow read: if request.time.seconds() > 29;

nanos

ثانیه های کسری در نانو به عنوان یک int.

// Allow reads during the first 0.1 seconds of each second
allow read: if request.time.nanos() < 100000000;

dayOfWeek

روز هفته، از 1 (دوشنبه) تا 7 (یکشنبه).

// Allow reads on weekdays (Monday to Friday)
allow read: if request.time.dayOfWeek() < 6;

dayOfYear

روز سال جاری، از 1 تا 366.

// Allow reads every fourth day
allow read: if request.time.dayOfYear() % 4 == 0;

toMillis

تعداد میلی ثانیه های فعلی را از دوران یونیکس برمی گرداند.

// Allow reads if the request is made before a specified time
allow read: if request.time.toMillis() < <milliseconds>;

duration

مقادیر مدت زمان به صورت ثانیه به اضافه ثانیه کسری در نانوثانیه نمایش داده می شود.

مقایسه

مدت زمان ها را می توان با استفاده از عملگرهای == ، != ، > ، < ، >= و <= مقایسه و مرتب کرد.

حسابی

مدت زمان ها به شرح زیر از جمع و تفریق بین مهرهای زمانی و مدت زمان پشتیبانی می کنند:

اصطلاح نتیجه
timestamp + duration timestamp
duration + timestamp timestamp
timestamp - duration timestamp
timestamp - timestamp duration
duration + duration duration
duration - duration duration

seconds

تعداد ثانیه ها در مدت زمان فعلی. باید بین -315,576,000,000 و +315,576,000,000 باشد.

nanos

تعداد ثانیه های کسری (بر حسب نانوثانیه) از مدت زمان جاری. باید بین -999,999,999 و +999,999,999 باشد. برای ثانیه های غیر صفر و نانوثانیه های غیر صفر، علائم هر دو باید با هم هماهنگ باشند.

duration.value

مدت زمان ها را می توان با استفاده از تابع duration.value(int magnitude, string units) ایجاد کرد، که یک مدت زمان از مقدار و واحد داده شده ایجاد می کند.

// All of these durations represent one hour:
duration.value(1, "h")
duration.value(60, "m")
duration.value(3600, "s")

unit ممکن عبارتند از:

مدت زمان unit
هفته ها w
روزها d
ساعت ها h
دقایق m
ثانیه ها s
میلی ثانیه ms
نانوثانیه ns

duration.time

مدت زمان ها را می توان با استفاده از تابع duration.time(int hours, int minutes, int seconds, int nanoseconds) ایجاد کرد که مدت زمان ساعت ها، دقیقه ها، ثانیه ها و نانوثانیه های معین را ایجاد می کند.

// Create a four hour, three minute, two second, one nanosecond duration
duration.time(4, 3, 2, 1)

list

یک لیست حاوی یک آرایه مرتب شده از مقادیر است که می تواند از نوع: null ، bool ، int ، float ، string ، path ، list ، map ، timestamp یا duration باشد.

با توجه به x و y از نوع list و i و j از نوع int

ایجاد

برای ایجاد یک لیست، مقادیر را بین پرانتزها اضافه کنید:

// Create a list of strings
['apples', 'grapes', 'bananas', 'cheese', 'goats']

مقایسه

لیست ها را می توان با استفاده از عملگرهای == != مقایسه کرد. برابری دو لیست مستلزم برابری همه مقادیر است.

شاخص و محدوده

عملگر index ، list[] ، مورد را در فهرست ارائه شده در فهرست برمی‌گرداند.

// Allow reads of all files that begin with 'a'
match /{fileName} {
  allow read: if fileName[0] == 'a';
}

عملگر range ، list[i:j] ، همه موارد موجود در لیست را بین شاخص‌های مشخص شده، از i (شامل) تا j (انحصاری) برمی‌گرداند. اگر i یا j مشخص نشده باشد، به ترتیب 0 و اندازه لیست را به طور پیش فرض تعیین می کنند، اما حداقل i یا j باید مشخص شود تا محدوده معتبر باشد.

// Allow reads of all files that begin with 'abcdef'
match /{fileName} {
  allow read: if fileName[0:6] == 'abcdef';
}

in

اگر مقدار مورد نظر در لیست موجود باشد true یا در صورت عدم وجود false برمی گرداند.

// Allow read if a filename has the string 'txt' in it
match /{fileName} {
  allow read: if 'txt' in fileName.split('\\.');
}

join

فهرستی از رشته ها را در یک رشته که با رشته داده شده از هم جدا شده اند، ترکیب می کند.

// Allow reads if the joined array is 'file.txt'
allow read: if ['file', 'txt'].join('.') == 'file.txt';

size

تعداد موارد موجود در لیست

// Allow read if there are three items in our list
allow read: if ['foo', 'bar', 'baz'].size() == 3;

hasAll

اگر همه مقادیر در لیست وجود داشته باشند، true را برمی گرداند.

// Allow read if one list has all items in the other list
allow read: if ['file', 'txt'].hasAll(['file', 'txt']);

map

یک نقشه شامل جفت‌های کلید/مقدار است، که کلیدها رشته‌ها هستند و مقادیر می‌توانند هر یک از این‌ها باشند: null ، bool ، int ، float ، string ، path ، list ، map ، timestamp یا duration .

ایجاد

برای ایجاد یک نقشه، جفت کلید/مقدار بین پرانتزها اضافه کنید:

// Create a map of strings to strings
{
  'mercury': 'mars',
  'rain': 'cloud',
  'cats': 'dogs',
}

مقایسه

نقشه ها را می توان با استفاده از عملگرهای == != مقایسه کرد. برابری دو نقشه مستلزم این است که همه کلیدها در هر دو نقشه وجود داشته باشند و همه مقادیر برابر باشند.

فهرست مطالب

مقادیر در نقشه با استفاده از علامت براکت یا نقطه قابل دسترسی هستند:

// Access custom metadata properties
allow read: if resource.metadata.property == 'property'
allow write: if resource.metadata['otherProperty'] == 'otherProperty'

اگر کلید وجود نداشته باشد، یک error برگردانده می شود.

in

اگر کلید مورد نظر در نقشه وجود داشته باشد true یا در صورت عدم وجود false را برمی گرداند.

// Allow reads if a property is present in the custom metadata
allow read: if property in resource.metadata;

size

تعداد کلیدها در نقشه

// Allow reads if there's exactly one custom metadata key
allow read: if resource.metadata.size() == 1;

keys

لیستی از تمام کلیدهای موجود در نقشه

// Allow reads if the first metadata key is 'myKey'
allow read: if resource.metadata.keys()[0] == 'myKey';

values

فهرستی از تمام مقادیر موجود در نقشه، به ترتیب کلید.

// Allow reads if the first metadata value is 'myValue'
allow read: if resource.metadata.values()[0] == 'myValue';

خطاها

ارزیابی خطا

قوانین امنیتی Firebase برای Cloud Storage ارزیابی را در صورت مواجه شدن با خطا ادامه می دهد. این مفید است زیرا && و || شرطی اگر شرطی به ترتیب به false یا true اتصال کوتاه کند، عبارات ممکن است خطا را جذب کنند. برای مثال:

اصطلاح نتیجه
error && true error
error && false false
error || true true
error || false error

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

// Error if resource.size is zero
allow read: if 1000000 / resource.size;

// Error, key doesn't exist
allow read: if resource.metadata.nonExistentKey == 'value';

// Error, no unit 'y' exists
allow read: if request.time < resource.timeCreated + duration.value(1, 'y');