Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

השתמש בתנאים בכללי האבטחה של אחסון בענן של 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 מפה <string, string> כשמשתמש נכנס לאתר, מספק uid , מזהה ייחודי של המשתמש, וכן token , מפת תביעות JWT אימות Firebase. אחרת, זה יהיה null .
params מפה <string, string> מפה המכילה את פרמטרי השאילתה של הבקשה.
path נָתִיב path המייצג את נתיב הבקשה מתבצעת בבית.
resource מפה <string, string> שווי המשאב החדש, מציג רק על 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 חוּט האתאג המשויך לאובייקט זה.
contentDisposition חוּט אופן התוכן המשויך לאובייקט זה.
contentEncoding חוּט קידוד התוכן המשויך לאובייקט זה.
contentLanguage חוּט שפת התוכן המשויכת לאובייקט זה.
contentType חוּט סוג התוכן המשויך לאובייקט זה.
metadata מפה <string, string> זוגות מפתח/ערך של מטא נתונים מותאמים אישית נוספים שצוינו על ידי מפתח.

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 הופך אותם לתחזוקים יותר ככל שמורכבות החוקים שלך גדלה.

הצעדים הבאים

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

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