يتم استخدام 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');