השתמש בתנאים בכללי האבטחה של אחסון בענן של Firebase

מדריך זה מתבסס על ללמוד את תחביר הליבה של השפה כללי אבטחת Firebase המדריך להראות כיצד להוסיף תנאי כללי אבטחת Firebase שלך עבור אחסון ענן.

אבן הבניין העיקרית של כללי אבטחת אחסון בענן הוא התנאי. תנאי הוא ביטוי בוליאני הקובע אם יש לאפשר או לדחות פעולה מסוימת. לקבלת כללים בסיסיים, באמצעות true ואת false literals כתנאים עובד prefectly היטב. אך כללי האבטחה של Firebase לשפת אחסון בענן נותנים לך דרכים לכתוב תנאים מורכבים יותר שיכולים:

  • בדוק אימות משתמש
  • אמת את הנתונים הנכנסים

אימות

כללי האבטחה של Firebase לאחסון ענן משתלבים עם אימות Firebase כדי לספק אימות רב עוצמה מבוסס משתמש לאחסון ענן. זה מאפשר בקרת גישה גרעינית המבוססת על טענות של אסימון אימות Firebase.

כאשר מאומתת מבצע המשתמשים בקשה נגד ענן אחסון, request.auth משתנה מאוכלס של המשתמש uid ( request.auth.uid ), כמו גם את הטענות של JWT אימות Firebase ( request.auth.token ).

בנוסף, בעת שימוש באימות המנהג, טענות נוספות צצו request.auth.token שדה.

כאשר משתמשים לא מאומת מבצעת בקשה, request.auth המשתנה הוא null .

באמצעות נתונים אלה, ישנן מספר דרכים נפוצות להשתמש באימות לאבטחת קבצים:

  • ציבור: להתעלם request.auth
  • מאומת פרטי: מחאה כי request.auth איננו null
  • משתמש פרטי: מחאה כי request.auth.uid שווה נתיב uid
  • קבוצתי פרטי: בדוק את טענות האסימון המותאם אישית כדי להתאים לתביעה שנבחרה, או קרא את מטא הנתונים של הקובץ כדי לראות אם קיים שדה מטא נתונים

פּוּמְבֵּי

כול שלטון שאינו לשקול את request.auth בהקשר יכול להיחשב public כלל, שכן היא אינה מביאה בחשבון את הקשר האימות של המשתמש. כללים אלה יכולים להיות שימושיים לצפייה בנתונים ציבוריים כגון נכסי משחק, קבצי סאונד או תוכן סטטי אחר.

// Anyone to read a public image if the file is less than 100kB
// Anyone can upload a public file ending in '.txt'
match /public/{imageId} {
  allow read: if resource.size < 100 * 1024;
  allow write: if imageId.matches(".*\\.txt");
}

מאומת פרטי

במקרים מסוימים, ייתכן שתרצה שניתן יהיה להציג נתונים על ידי כל המשתמשים המאומתים ביישום שלך, אך לא על ידי משתמשים לא מאומתים. מאז request.auth המשתנה הוא null עבור כל המשתמשים לא מאומתת, כל מה שאתה צריך לעשות הוא לבדוק את request.auth משתנה קיים כדי לדרוש אימות:

// Require authentication on all internal image reads
match /internal/{imageId} {
  allow read: if request.auth != null;
}

משתמש פרטי

ללא ספק מקרה השימוש הנפוץ ביותר עבור request.auth יהיה לספק למשתמשים בודדים עם הרשאות פרטניות על הקבצים שלהם: מתמונות פרופיל העלאת קריאת מסמכים פרטיים.

מאז קבצים לאחסון בענן יש "נתיב" מלא את הקובץ, כל מה שנדרש כדי ליצור קובץ בשליטת המשתמש הוא פיסת מידע מזהה ייחודי, המשתמש קידומת שם הקובץ (כגון של המשתמש uid ) כי ניתן לבדוק כאשר מעריכים את הכלל:

// Only a user can upload their profile picture, but anyone can view it
match /users/{userId}/profilePicture.png {
  allow read;
  allow write: if request.auth.uid == userId;
}

קבוצה פרטית

מקרה שימוש נפוץ לא פחות יהיה לאפשר הרשאות קבוצתיות על אובייקט, כגון לאפשר למספר חברי צוות לשתף פעולה במסמך משותף. ישנן מספר גישות לעשות זאת:

  • מנטה אימות Firebase מנהג אסימון המכיל מידע נוסף על חבר לקבוצה (כגון מזהה הקבוצה)
  • כלול מידע הקבוצה (כגון קבוצת מזהה או ברשימת המורשים uid ים) מטה הקובץ

לאחר שמאוחסנים נתונים אלה באסימון או במטא נתונים של הקובץ, ניתן להפנות אליהם מתוך כלל:

// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/{groupId}/{fileName} {
  allow read: if resource.metadata.owner == request.auth.token.groupId;
  allow write: if request.auth.token.groupId == groupId;
}

הערכת בקשה

העלאות, הורדות, שינויי metadata, ותמחק מוערכות באמצעות request נשלחת לאחסון בענן. בנוסף מזהה הייחודי של המשתמש, ומטען אימות Firebase ב request.auth האובייקט כמתואר לעיל, request משתנית מכיל את נתיב הקובץ שבו הבקשה מתבצעת, הפעם כאשר קבלת הבקשה, ואת החדש resource הערך אם הבקשה היא כתיבה. כותרות HTTP ומצב אימות כלולים גם כן.

request האובייקט מכיל גם את המזהה הייחודית של המשתמש, ומטען אימות Firebase ב request.auth האובייקט, אשר יוסבר נוסף האבטחה המבוססת משתמש קטע Docs.

רשימה מלאה של נכסי request האובייקט זמינה להלן:

תכונה סוּג תיאור
auth מפה <מחרוזת, מחרוזת> כשמשתמש נכנס לאתר, מספק uid , מזהה ייחודי של המשתמש, וכן token , מפת תביעות JWT אימות Firebase. אחרת, זה יהיה null .
params מפה <מחרוזת, מחרוזת> מפה המכילה את פרמטרי השאילתה של הבקשה.
path נָתִיב path המייצג את נתיב הבקשה מתבצעת בבית.
resource מפה <מחרוזת, מחרוזת> שווי המשאב החדש, מציג רק על write בקשות.
time חותמת זמן חותמת זמן המייצגת את זמן השרת בו מבקשים את הבקשה.

הערכת משאבים

בעת הערכת כללים, ייתכן שתרצה גם להעריך את מטא הנתונים של הקובץ המועלה, מוריד, שונה או נמחק. זה מאפשר לך ליצור כללים מורכבים ועוצמתיים שעושים דברים כמו רק להעלות קבצים עם סוגי תוכן מסוימים, או למחוק רק קבצים גדולים מגודל מסוים.

אבטחת Firebase כללי אחסון הענן מספקים metadata קובץ resource האובייקט, אשר מכיל זוגות ערך / מפתח של metadata ועלו באובייקט אחסון בענן. ניתן לבדוק תכונות אלו על read או write בקשות כדי להבטיח שלמות הנתונים.

על write בקשות (למשל העלאות, עדכוני metadata, ומחיקות), בנוסף resource האובייקט, אשר מכיל מידע נוסף על קובץ עבור הקובץ שקיים כיום בנתיב הבקשה, יש לך גם את היכולת להשתמש request.resource האובייקט, שמכיל תת-קבוצה של מטא-הנתונים של הקובץ שייכתב אם הכתיבה מותרת. באפשרותך להשתמש בשני הערכים הללו כדי להבטיח שלמות נתונים או לאכוף מגבלות יישומים כגון סוג קובץ או גודל.

רשימה מלאה של נכסי resource האובייקט זמינה להלן:

תכונה סוּג תיאור
name חוּט השם המלא של האובייקט
bucket חוּט שם הדלי בו שוכן האובייקט.
generation int דור אובייקט Google Cloud Storage של האובייקט הזה.
metageneration int Metageneration אובייקט Google Cloud Storage של האובייקט הזה.
size int גודל האובייקט בתים.
timeCreated חותמת זמן חותמת זמן המייצגת את הזמן בו נוצר אובייקט.
updated חותמת זמן חותמת זמן המייצגת את הזמן שבו אובייקט עודכן לאחרונה.
md5Hash חוּט חשיש MD5 של האובייקט.
crc32c חוּט חשיש crc32c של האובייקט.
etag חוּט ה- etag הקשור לאובייקט זה.
contentDisposition חוּט נטיית התוכן הקשורה לאובייקט זה.
contentEncoding חוּט קידוד התוכן המשויך לאובייקט זה.
contentLanguage חוּט שפת התוכן המשויכת לאובייקט זה.
contentType חוּט סוג התוכן המשויך לאובייקט זה.
metadata מפה <מחרוזת, מחרוזת> זוגות מפתח / ערך של מטא נתונים מותאמים אישית נוספים שצוינו על ידי מפתח.

request.resource מכיל את כל אלה, למעט generation , metageneration , etag , timeCreated , ו updated .

אמת נתונים

כללי אבטחת Firebase עבור אחסון ענן יכולים לשמש גם עבור אימות נתונים, לרבות אימות שם קובץ ונתיב וכן נכסי metadata קבצים כגון contentType ואת size .

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      // Only allow uploads of any image file that's less than 5MB
      allow write: if request.resource.size < 5 * 1024 * 1024
                   && request.resource.contentType.matches('image/.*');
    }
  }
}

פונקציות מותאמות אישית

ככל שכללי האבטחה של Firebase הופכים מורכבים יותר, ייתכן שתרצה לעטוף קבוצות של תנאים בפונקציות שתוכל לעשות בהן שימוש חוזר בכל מערך הכללים שלך. כללי אבטחה תומכים בפונקציות מותאמות אישית. התחביר לפונקציות מותאמות אישית דומה קצת ל- JavaScript, אך פונקציות כללי האבטחה של Firebase נכתבות בשפה ספציפית לתחום שיש לה מגבלות חשובות:

  • פונקציות יכולות להכיל אחת בלבד return בהצהרה. הם לא יכולים להכיל שום היגיון נוסף. לדוגמה, הם לא יכולים לבצע לולאות או להתקשר לשירותים חיצוניים.
  • פונקציות יכולות לגשת אוטומטית לפונקציות ולמשתנים מההיקף שבו הם מוגדרים. לדוגמה, פונקציה המוגדרת בתוך service firebase.storage ההיקף לו גישה resource משתנה, ועל הענן Firestore בלבד, פונקציות מובנות כגון get() ו exists() .
  • פונקציות עשויות לקרוא לפונקציות אחרות אך עשויות שלא להשתנות. עומק ערימת השיחות הכולל מוגבל ל -10.
  • בגרסה rules2 , פונקציות יכולות להגדיר משתנות באמצעות let מילות המפתח. לפונקציות יכולות להיות מספר כלשהו של כריכות לט, אך עליהן להסתיים בהצהרת החזרה.

פונקציה מוגדרת עם function המילה ולוקחת אפס או יותר ויכוחים. לדוגמה, ייתכן שתרצה לשלב את שני סוגי התנאים המשמשים בדוגמאות לעיל לפונקציה אחת:

service firebase.storage {
  match /b/{bucket}/o {
    // True if the user is signed in or the requested data is 'public'
    function signedInOrPublic() {
      return request.auth.uid != null || resource.data.visibility == 'public';
    }
    match /images/{imageId} {
      allow read, write: if signedInOrPublic();
    }
    match /mp3s/{mp3Ids} {
      allow read: if signedInOrPublic();
    }
  }
}

השימוש בפונקציות בכללי האבטחה של Firebase הופך אותם לשמירים יותר ככל שמורכבות הכללים שלך הולכת וגדלה.

הצעדים הבאים

לאחר דיון זה בתנאים, הבנתם חוקים מתוחכמים יותר ומוכנים:

למד כיצד לטפל במקרי שימוש מרכזיים ולמד את זרימת העבודה לפיתוח, בדיקה ופריסה של כללים: