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

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

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

הצהרת שירות ומאגר מידע

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

service firebase.storage {
    // ...
}

service firebase.storage הכרזת טווחי הכללים באחסון בענן, מניעת קונפליקטים בין אחסון ענן אבטחה חוקי ותקנון למוצרים אחרים כגון ענן firestore.

כללי קריאה/כתיבה בסיסיים

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

בשנת ruleset ברירת המחדל שלך, הראשון match אמירה משתמשת {bucket} ביטוי כלליים כדי לציין את הכללים החלים על כל דליים בפרויקט שלך. נדון ברעיון של התאמות תווים כלליים יותר בפרק הבא.

service firebase.storage {
  // The {bucket} wildcard indicates we match files in all Cloud Storage buckets
  match /b/{bucket}/o {
    // Match filename
    match /filename {
      allow read: if <condition>;
      allow write: if <condition>;
    }
  }
}

כל הצהרות ההתאמה מצביעות על קבצים. הצהרת משחק יכולה להצביע על קובץ מסוים, כמו match /images/profilePhoto.png .

התאמת תווים כלליים

בשנת additiont כדי הצבעה על קובץ יחיד, הכללים יכולים להשתמש בתווים כלליים כדי להצביע על כל קובץ עם קידומת מחרוזת נתונה שמה, כולל חתכים, כמו match /images/{imageId} .

בדוגמה לעיל, הצהרת המשחק משתמשת {imageId} תחביר הכללי. אמצעי זה הכלל חל על כל קובץ עם /images/ בתחילת שמה, כגון /images/profilePhoto.png או /images/croppedProfilePhoto.png . כאשר allow ביטויים בדוח ההתאמה מוערכים, את imageId משתנה יפתור לשם הקובץ תמונה, כגון profilePhoto.png או croppedProfilePhoto.png .

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

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

נתונים היררכיים

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

קחו למשל את המצב של קבוצה של קבצים עם שמות שכל להתחיל עם /images/ גזע. כללי אבטחת Firebase חלים רק על הקובץ המתאים, כך שולטים הגישה מוגדרת על /images/ גזע אינו חל על /mp3s/ גזע. במקום זאת, כתוב כללים מפורשים התואמים לתבניות שונות של קבצים:

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      allow read, write: if <condition>;
    }

    // Explicitly define rules for the 'mp3s' pattern
    match /mp3s/{mp3Id} {
      allow read, write: if <condition>;
    }
  }
}

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

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Exact match for "images/profilePhoto.png"
      match /profilePhoto.png {
        allow write: if <condition>;
      }
    }
  }
}
service firebase.storage {
  match /b/{bucket}/o {
    // Exact match for "images/profilePhoto.png"
    match /images/profilePhoto.png {
      allow write: if <condition>;
      }
  }
}

תווים כלליים של התאמה רקורסיבית

בנוסף בתווים כלליים כי מחרוזות משחק ולחזור בסוף שם קובץ, בתו כללי מגזר מרובה יכולים להיות הכריזו על התאמה מורכבת יותר על ידי הוספה =** לשם הכלליים, כמו {path=**} :

// Partial match for files that start with "images"
match /images {

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

אם מספר כללים להתאים לקובץ, התוצאה היא OR של התוצאה של כל הערכות הכללים. כלומר, אם בכלל כלל הקובץ מתאים evalutes כדי true , התוצאה היא true .

בשנת הכללים לעיל, את הקובץ "תמונות / profilePhoto.png" ניתן לקרוא אם מתקיימים condition או other_condition להעריך אל נכון, בעוד הקובץ "images / משתמשים / משתמש: 12,345 / profilePhoto.png" כפוף רק התוצאה של other_condition .

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

גרסה 1

כללי האבטחה של Firebase משתמשים בגרסה 1 כברירת מחדל. בגרסה 1, תווים כלליים רקורסיביים תואמים רכיב אחד או יותר של שם קובץ, לא אפס או יותר אלמנטים. לפיכך, match /images/{filenamePrefixWildcard}/{imageFilename=**} תואמת filename כמו /images/profilePics/profile.png, אבל לא /images/badge.png. השתמש /images/{imagePrefixorFilename=**} במקום.

תווים כלליים רקורסיביים חייבים להגיע בסוף הצהרת משחק.

אנו ממליצים להשתמש בגרסה 2 על התכונות החזקות יותר שלה.

גרסה 2

בגרסה 2 של כללי האבטחה של Firebase, תווים כלליים רקורסיביים תואמים לאפריטי נתיב או יותר. לפיכך, /images/{filenamePrefixWildcard}/{imageFilename=**} תואם שמות הקבצים /images/profilePics/profile.png ו /images/badge.png.

עליך להצטרף כדי גירסה 2 על ידי הוספת rules_version = '2'; בראש כללי האבטחה שלך:

rules_version = '2';
service cloud.storage {
  match /b/{bucket}/o {
   ...
 }
}

תוכל לכלול תו כללי רקורסיבי אחד לכל משפט התאמה, אך בגרסה 2 תוכל למקם את התו הכללי בכל מקום בהצהרת ההתאמה. לדוגמה:

rules_version = '2';
service firebase.storage {
 match /b/{bucket}/o {
   // Matches any file in a songs "subdirectory" under the
   // top level of your Cloud Storage bucket.
   match /{prefixSegment=**}/songs/{mp3filenames} {
     allow read, write: if <condition>;
   }
  }
}

פעולות גרגיריות

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

read מבצע יהיה ניתן לפרוץ get ואת list .

write כלל ניתן לחלק create , update , וכן delete :

service firebase.storage {
  match /b/{bucket}/o {
    // A read rule can be divided into read and list rules
    match /images/{imageId} {
      // Applies to single document read requests
      allow get: if <condition>;
      // Applies to list and listAll requests (Rules Version 2)
      allow list: if <condition>;

    // A write rule can be divided into create, update, and delete rules
    match /images/{imageId} {
      // Applies to writes to nonexistent files
      allow create: if <condition>;

      // Applies to updates to file metadata
      allow update: if <condition>;

      // Applies to delete operations
      allow delete: if <condition>;
    }
  }
 }
}

הצהרות התאמה חופפות

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

service firebase.storage {
  match b/{bucket}/o {
    // Matches any filename containing string '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches all filenames containing string `/images/`
    match /images/{imageId=**} {
      allow read, write: if true;
    }
  }
}

בדוגמה לעיל, כל קורא וכותב לקבצים עם מחרוזת /images/ מקום filename שלהם תותר כי הכלל השני הוא תמיד true , למרות הכלל הראשון הוא תמיד false .

חוקים אינם מסננים

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

לדוגמה, קח את כלל האבטחה הבא:

service firebase.storage {
  match /b/{bucket}/o {
    // Allow the client to read files with contentType 'image/png'
    match /aFileNamePrefix/{aFileName} {
      allow read: if resource.contentType == 'image/png';
    }
  }
}

נדחתה: כלל זה דוחה את הבקשה הבאה משום להגדיר התוצאה יכולה לכלול קבצים שבו contentType אינו image/png :

אינטרנט
filesRef = storage.ref().child("aFilenamePrefix");

filesRef.listAll()
    .then(function(result) {
      console.log("Success: ", result.items);
    })
});

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

הצעדים הבאים

תוכל להעמיק את ההבנה שלך לגבי כללי האבטחה של Firebase לאחסון ענן:

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

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

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