כללי אבטחה של Firebase עבור אחסון בענן

כללי האבטחה של 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');