למד את תחביר הליבה של כללי האבטחה של 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 להשתמש במקרים ספציפיים לאחסון בענן: