כללי האבטחה של Firebase עבור Cloud Storage משמשים כדי לקבוע למי יש גישת קריאה וכתיבה לקבצים המאוחסנים ב-Cloud Storage, כמו גם כיצד קבצים בנויים ואילו מטא נתונים הם מכילים. כללי האבטחה של Cloud Storage מורכבים מכללים המחשיבים את request
resource
כדי לאפשר או לדחות פעולה רצויה, כגון העלאת קובץ או אחזור מטא נתונים של קובץ. מסמכי עזר אלה מכסים את סוגי הכללים, המאפיינים של request
resource
, סוגי הנתונים המשמשים את כללי האבטחה של Cloud Storage וכיצד מתרחשות שגיאות.
כְּלָל
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 | ה-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 | ה-tenantId המשויך לחשבון, אם קיים. למשל 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
מחרוזת המכילה את ה-hash 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
מחרוזת המכילה את ה-hash 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.קיים
הפונקציות 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
הוא ההצהרה הראשונה בקובץ כללי אבטחה של Cloud Storage, ומפרט על איזה שירות יחולו כללים אלו.
שֵׁם
name
שם כללי השירות יחולו על. הערך הנוכחי היחיד הוא firebase.storage
.
// Specify the service name
service firebase.storage {
match /b/{bucket}/o {
...
}
}
סוגי מידע
שפת הכללים מאפשרת לך לבדוק סוג באמצעות האופרטור 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
וכו'.
Ints הם ערכי 64 סיביות חתומים, ו-floats הם ערכים תואמי IEEE 754 של 64 סיביות. ערכים מסוג 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
אם המחרוזת תואמת לביטוי הרגולרי הנתון. משתמש בתחביר 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
ערך השנה כ-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
היום הנוכחי בחודש בתור אינט, מ-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 עבור אחסון ענן ממשיכים בהערכה כאשר נתקלים בשגיאות. זה שימושי כי &&
מותנה ו- ||
ביטויים עשויים לספוג שגיאה אם התנאי יקצר בדרך אחרת ל- 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');