瞭解適用於 Cloud Storage 語言的 Firebase 安全性規則核心語法

Cloud StorageFirebase Security Rules 可讓您控管對 Cloud Storage 值區中儲存物件的存取權。您可以使用靈活的規則語法建立規則,控制所有作業,包括寫入 Cloud Storage 儲存體的所有作業,以及對特定檔案執行的作業。

本指南將說明 Cloud Storage Security Rules 的基本語法和結構,以便建立完整的規則集。

服務和資料庫宣告

Cloud StorageFirebase Security Rules 一律會以以下宣告開頭:

service firebase.storage {
    // ...
}

service firebase.storage 宣告會將規則範圍設為 Cloud Storage,避免 Cloud Storage Security RulesCloud Firestore 等其他產品的規則發生衝突。

基本讀取/寫入規則

基本規則包含 match 陳述式,用於識別 Cloud Storage 值區、指定檔案名稱的配對陳述式,以及 allow 運算式,用於說明何時允許讀取指定資料。allow 運算式會指定相關的存取方法 (例如讀取、寫入),以及條件 (允許或拒絕存取)。

在預設規則集中,第一個 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 所示。

比對萬用字元

除了指向單一檔案之外,Rules 還可以使用萬用字元指向名稱中含有指定字串前置字元的任何檔案,包括斜線 (例如 match /images/{imageId})。

在上例中,比對陳述式使用 {imageId} 萬用字元語法。也就是說,這個規則會套用至名稱開頭為 /images/ 的任何檔案,例如 /images/profilePhoto.png/images/croppedProfilePhoto.png。評估比對陳述式中的 allow 運算式時,imageId 變數會解析為圖片檔案名稱,例如 profilePhoto.pngcroppedProfilePhoto.png

您可以在 match 中參照萬用字元變數,以便提供檔案名稱或路徑授權:

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

階層式資料

如前所述,Cloud Storage 值區中沒有階層結構。不過,只要使用檔案命名慣例 (通常會在檔案名稱中加入斜線),就能模擬出類似巢狀目錄和子目錄的結構。請務必瞭解 Firebase Security Rules 如何與這些檔案名稱互動。

請考慮以下情況:一組檔案的名稱都以 /images/ 開頭。Firebase Security Rules 只會套用至相符的檔案名稱,因此在 /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。也就是說,如果檔案相符的任何規則評估為 true,結果就是 true

在上述規則中,如果 conditionother_condition 的評估結果為 true,則可讀取檔案「images/profilePhoto.png」,而檔案「images/users/user:12345/profilePhoto.png」則只受 other_condition 的結果影響。

Cloud Storage Security Rules 不會層疊,且只有在要求路徑與指定規則的路徑相符時,系統才會評估規則。

版本 1

Firebase Security Rules 預設會使用第 1 版。在 1 版中,遞迴萬用字元會比對一或多個檔案名稱元素,而非零或多個元素。因此,match /images/{filenamePrefixWildcard}/{imageFilename=**} 會比對 /images/profilePics/profile.png 這類檔案名稱,但不會比對 /images/badge.png。請改用 /images/{imagePrefixorFilename=**}

遞迴萬用字元必須放在比對陳述式的結尾。

建議您使用功能更強大的 2 版。

版本 2

Firebase Security Rules 2 版中,遞迴萬用字元會比對零個或多個路徑項目。因此,/images/{filenamePrefixWildcard}/{imageFilename=**} 會比對檔案名稱 /images/profilePics/profile.png 和 /images/badge.png。

您必須在安全性規則頂端新增 rules_version = '2';,才能選擇採用第 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>;
   }
  }
}

精細作業

在某些情況下,將 readwrite 細分為更精細的作業會很有幫助。舉例來說,應用程式可能會在建立檔案和刪除檔案時,強制執行不同的條件。

read 作業可分為 getlist

write 規則可分為 createupdatedelete

service firebase.storage {
  match /b/{bucket}/o {
    // A read rule can be divided into read and list rules
    match /images/{imageId} {
      // Applies to single file 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 file contents
      allow create: if <condition>;

      // Applies to updates to (pre-existing) 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 file names directly inside of '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches file names anywhere under `/images/`
    match /images/{imageId=**} {
      allow read, write: if true;
    }
  }
}

在上例中,系統允許對名稱以 /images/ 開頭的檔案執行所有讀取和寫入作業,因為第二個規則一律為 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);
    })
});

Cloud Storage Security Rules 中的規則會根據每個查詢的潛在結果進行評估,如果可能傳回用戶端沒有讀取權限的檔案,就會拒絕要求。存取要求必須遵守規則設定的限制。

後續步驟

您可以進一步瞭解 Firebase Security Rules 適用於 Cloud Storage 的情況:

  • 瞭解規則語言的下一個重要概念:動態條件,讓規則可檢查使用者授權、比較現有資料和傳入資料、驗證傳入資料等等。

  • 查看常見的安全性用途,以及用於解決這些問題的 Firebase Security Rules 定義

您可以探索 Cloud StorageFirebase Security Rules 用途: