قوانین امنیتی 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');