قواعد أمان Firebase لمرجع Cloud Storage

يتم استخدام Firebase Security Rules لـ Cloud Storage لتحديد من لديه الإذن بالقراءة والكتابة إلى الملفات المخزَّنة في Cloud Storage، فضلاً عن طريقة تنظيم الملفات وبيانات التعريف التي تحتوي عليها. تتكون Cloud Storage Security Rules من قواعد النظر في request وresource للسماح بتنفيذ الإجراء المطلوب أو رفضه، مثل مثل تحميل ملف أو استرداد البيانات الوصفية للملف. تغطي هذه المستندات المرجعية وأنواع القواعد وخصائص request وresource والبيانات الأنواع التي يستخدمها Cloud Storage Security Rules، وكيفية حدوث الأخطاء.

قاعدة

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

يمكنك استخدام مقاطع مسار واحد لإنشاء قاعدة تُطابق ملف مخزَّن في Cloud Storage.

// 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}

إذا كنت تريد تطبيق قاعدة على ملفات متعددة في المسار نفسه، يمكنك استخدام مقطع مسار حرف البدل لمطابقة جميع الملفات في مسار معين. متغيّر حرف بدل يتم تعريفه في مسار من خلال إحاطة متغير في أقواس معقوفة: {variable}. ويمكن الوصول إلى هذا المتغيّر ضمن عبارة المطابقة باعتبارها 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=**} يتوفّر متغيّر حرف بدل متعدد الشرائح ضمن المطابقة عبارة ككائن 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

عندما يقدّم مستخدم تمت مصادقته طلبًا ضد "Cloud Storage"، تتم تعبئة المتغيّر auth بالخيار uid للمستخدم (request.auth.uid) على النحو التالي: بالإضافة إلى ادعاءات Firebase Authentication JWT (request.auth.token).

يحتوي request.auth.token على بعض المفاتيح التالية أو جميعها:

الحقل الوصف
email تمثّل هذه السمة عنوان البريد الإلكتروني المرتبط بالحساب، إذا كان متوفّرًا.
email_verified true إذا أثبت المستخدم ملكية إمكانية الوصول إلى عنوان email. يثبت بعض مقدّمي الخدمة تلقائيًا ملكية عناوين البريد الإلكتروني التي يملكونها.
phone_number تمثّل هذه السمة رقم الهاتف المرتبط بالحساب، إذا كان متوفّرًا.
name الاسم المعروض للمستخدم، إذا تم ضبطه.
sub المعرّف الفريد في 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 على البيانات الوصفية للملفات في Cloud Storage، مثل اسم الملف وحجمه ووقت الإنشاء بيانات التعريف المخصصة.

أماكن إقامة

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

عدد صحيح يحتوي على Google Cloud Storage إنشاء الكائنات من الملف. تُستخدَم لتحديد إصدارات العناصر.

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

metageneration

عدد صحيح يحتوي على Google Cloud Storage إنشاء البيانات الوصفية للكائنات من الملف. تُستخدَم لتحديد إصدارات العناصر.

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

size

يشير ذلك المصطلح إلى عدد صحيح يحتوي على حجم الملف بالبايت.

// 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

سلسلة تحتوي على 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.exists

تحقّق من توفّر مستند 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 هو التعريف الأول في ملف Cloud Storage Security Rules، يحدد الخدمة التي ستسري عليها هذه القواعد.

الاسم

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 بت بعلامة، والقيم العائمة هي قيم متوافقة مع معيار IEEE 754 لإصدار 64 بت. سيتم فرض القيم من النوع int على float عند استخدامها في المقارنات العمليات الحسابية باستخدام القيمة float.

مقارنة

يمكن مقارنة الأعداد الصحيحة والأعداد العشرية وترتيبها باستخدام == و!= و> و< >=، و<= عوامل التشغيل.

الحساب

يمكن جمع الأعداد الصحيحة والأعداد العشرية وطرحها وضربها وقسمة الناتج والقسمة تم إلغاؤه:

العملية التعبير
إضافة x + y
الطرح x - y
الضرب x * y
القسم x / y
باقي القسمة x % y
نفي -x

الدالات الحسابية

تقدّم Firebase Security Rules لـ Cloud Storage أيضًا عددًا من التطبيقات المساعدة في مادة الرياضيات. الدوال لتبسيط التعبيرات:

دالة الوصف
math.ceil(x) سقف القيمة الرقمية
math.floor(x) الحد الأدنى للقيمة الرقمية
math.round(x) تقريب قيمة الإدخال إلى أقرب عدد صحيح
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 إذا كانت السلسلة تُطابق تعبيرًا عاديًا. الاستخدامات بنية Google RE2.

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

split

لتقسيم سلسلة وفقًا لتعبير عادي معيّن وعرض list السلاسل. تستخدم بنية Google 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

قيمة السنة كعدد صحيح، من 1 إلى 9999.

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

month

قيمة الشهر كعدد صحيح، من 1 إلى 12.

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

day

اليوم الحالي من الشهر كعدد صحيح، من 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

قيمة الساعات كعدد صحيح، من 0 إلى 23.

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

minutes

قيمة الدقائق كعدد صحيح، من 0 إلى 59.

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

seconds

قيمة الثواني كعدد صحيح، من 0 إلى 59.

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

nanos

يشير ذلك المصطلح إلى الثواني الكسرية في وحدات nanos كعدد صحيح.

// 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 Security Rules لـ 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');