了解 Cloud Storage 語言的 Firebase 安全規則的核心語法

Cloud Storage 的 Firebase 安全規則允許您控制對存儲在 Cloud Storage 存儲分區中的對象的訪問。靈活的規則語法允許您創建規則來控制任何操作,從對 Cloud Storage 存儲分區的所有寫入到對特定文件的操作。

本指南介紹了用於創建完整規則集的 Cloud Storage 安全規則的基本語法和結構。

服務和數據庫聲明

Cloud Storage 的 Firebase 安全規則始終以以下聲明開頭:

service firebase.storage {
    // ...
}

service firebase.storage聲明作用域的規則,以雲存儲,從而防止雲存儲安全規則與規則之間的衝突,其他產品如雲公司的FireStore。

基本讀/寫規則

基本規則由一個的match語句識別雲存儲桶,一個匹配語句中指定一個文件名,和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

匹配通配符

在additiont要指向一個單一的文件,規則可以使用通配符來指向任何文件名稱中帶有特定字符串前綴,包括斜杠,在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 安全規則如何與這些文件名交互非常重要。

考慮一組文件的情況與名稱,所有皆以/images/幹。火力地堡安全規則只適用於匹配的文件名,所以在定義的訪問控制/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

在上面的規則,文件“的圖像/ profilePhoto.png”可以如果任一被讀取conditionother_condition評價為真,而文件“的圖像/用戶/用戶:12345 / profilePhoto.png”是只的結果受試者other_condition .

Cloud Storage 安全規則不會級聯,並且僅當請求路徑與指定規則的路徑匹配時才會評估規則。

版本 1

Firebase 安全規則默認使用版本 1。在版本 1 中,遞歸通配符匹配一個或多個文件名元素,而不是零個或多個元素。因此, match /images/{filenamePrefixWildcard}/{imageFilename=**}像/images/profilePics/profile.png文件名相匹配時,但不是/images/badge.png。使用/images/{imagePrefixorFilename=**}代替。

遞歸通配符必須出現在匹配語句的末尾。

我們建議您使用版本 2,因為它具有更強大的功能。

版本 2

在 Firebase 安全規則的第 2 版中,遞歸通配符匹配零個或多個路徑項。因此, /images/{filenamePrefixWildcard}/{imageFilename=**}匹配檔案名稱/images/profilePics/profile.png和/images/badge.png。

你必須通過添加選擇加入2版本rules_version = '2';在您的安全規則的頂部:

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

每個 match 語句最多可以有一個遞歸通配符,但在版本 2 中,您可以將此通配符放在 match 語句中的任何位置。例如:

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 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/在其文件名的任何地方將被允許的,因為第二條規則是永遠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 安全規則中的規則根據其潛在結果評估每個查詢,如果它可能返回客戶端無權讀取的文件,則請求失敗。訪問請求必須遵循您的規則設置的約束。

下一步

您可以加深對 Cloud Storage 的 Firebase 安全規則的理解:

您可以探索特定於 Cloud Storage 的 Firebase 安全規則用例: