Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

學習保護文件

雲存儲為雲存儲提供了一個基於聲明式路徑的安全模型,稱為Firebase安全規則,可讓您快速輕鬆地保護文件。

了解規則

《用於Cloud Storage的Firebase安全規則》用於確定誰擁有對Cloud Storage中存儲的文件的讀寫訪問權,以及文件的結構方式和包含的元數據。規則的基本類型是allow規則,如果指定了可選指定的條件,則該規則允許readwrite請求,例如:

// If no condition is specified, the rule evaluates to true
allow read;

// Rules can optionally specify a condition
allow write: if <condition>;

// Rules can also specify multiple request methods
allow read, write: if <condition>;

匹配路徑

存儲安全規則match用於訪問Cloud Storage中文件的文件路徑match 。規則可以match精確路徑或通配符路徑,並且規則也可以嵌套。如果沒有匹配規則允許請求方法,或者條件評估為false ,則拒絕該請求。

完全匹配

// Exact match for "images/profilePhoto.png"
match /images/profilePhoto.png {
  allow write: if <condition>;
}

// Exact match for "images/croppedProfilePhoto.png"
match /images/croppedProfilePhoto.png {
  allow write: if <other_condition>;
}

嵌套匹配

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/profilePhoto.png"
  match /profilePhoto.png {
    allow write: if <condition>;
  }

  // Exact match for "images/croppedProfilePhoto.png"
  match /croppedProfilePhoto.png {
    allow write: if <other_condition>;
  }
}

通配符匹配

規則也可以用於使用通配符match模式。通配符是一個命名變量,表示單個字符串(例如profilePhoto.png )或多個路徑段(例如images/profilePhoto.png

通配符是通過在通配符名稱周圍加上花括號來創建的,例如{string} 。可以通過在通配符名稱上添加=**來聲明多段通配符,例如{path=**}

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/*"
  // e.g. images/profilePhoto.png is matched
  match /{imageId} {
    // This rule only matches a single path segment (*)
    // imageId is a string that contains the specific segment matched
    allow read: if <condition>;
  }

  // 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的結果影響。

可以從match提供文件名或路徑授權中引用通配符變量:

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

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

要求評估

使用發送到Cloud Storage的request評估上傳,下載,元數據更改和刪除。 request變量包含執行request的文件路徑,接收到請求的時間以及(如果請求是寫操作的)新resource值。 HTTP標頭和身份驗證狀態也包括在內。

request像在request.auth對像中還包含用戶的唯一ID和Firebase身份驗證有效負載,這將在文檔的“基於用戶的安全性”部分中進一步說明。

以下是request對像中屬性的完整列表:

屬性類型描述
auth map <字串,字串> 當用戶登錄時,提供uid ,用戶的唯一ID和token ,即Firebase身份驗證JWT聲明的映射。否則,它將為null
params map <字串,字串> 包含請求查詢參數的映射。
path 路徑代表正在執行請求的path的路徑。
resource map <字串,字串> 新資源值,僅在write請求中出現。
time 時間戳記表示請求評估所在的服務器時間的時間戳。

資源評估

在評估規則時,您可能還需要評估正在上載,下載,修改或刪除的文件的元數據。這使您可以創建複雜而強大的規則,這些規則的作用類似於僅允許上傳具有某些內容類型的文件,或僅刪除大於特定大小的文件。

《用於雲存儲的Firebase安全規則》在resource像中提供文件元數據,該文件元數據包含浮在雲存儲對像中的元數據的鍵/值對。可以根據readwrite請求檢查這些屬性,以確保數據完整性。

對於write請求(例如上載,元數據更新和刪除),除了resource對象(其中包含請求路徑中當前存在的文件的文件元數據)外,您還可以使用request.resource對象,如果允許寫入,它包含要寫入的文件元數據的子集。您可以使用這兩個值來確保數據完整性或強制執行應用程序約束,例如文件類型或大小。

下面提供了resource對像中屬性的完整列表:

屬性類型描述
name 對象的全名
bucket 該對象所在的存儲桶的名稱。
generation 整型對象GCS對像生成
metageneration 整型對象GCS對像元生成。
size 整型對象的大小(以字節為單位)。
timeCreated 時間戳記表示對象創建時間的時間戳。
updated 時間戳記表示對像上次更新時間的時間戳。
md5Hash 對象的MD5哈希值。
crc32c 對象的crc32c哈希。
etag 與此對象關聯的etag。
contentDisposition 與此對象關聯的內容處置。
contentEncoding 與此對象關聯的內容編碼。
contentLanguage 與此對象關聯的內容語言。
contentType 與此對象關聯的內容類型。
metadata map <字串,字串> 開發人員指定的其他自定義元數據的鍵/值對。

request.resource包含所有這些, generationmetageneration generationetagtimeCreatedupdated timeCreated

完整的例子

綜合考慮,您可以為圖像存儲解決方案創建完整的規則示例:

service firebase.storage {
 match /b/{bucket}/o {
   match /images {
     // Cascade read to any image type at any path
     match /{allImages=**} {
       allow read;
     }

     // Allow write files to the path "images/*", subject to the constraints:
     // 1) File is less than 5MB
     // 2) Content type is an image
     // 3) Uploaded content type matches existing content type (if it exists)
     // 4) File name (stored in imageId wildcard variable) is less than 32 characters
     match /{imageId} {
       allow write: if request.resource.size < 5 * 1024 * 1024
                    && request.resource.contentType.matches('image/.*')
                    && (resource == null || request.resource.contentType == resource.contentType)
                    && imageId.size() < 32
     }
   }
 }
}

現在,讓我們在“ 用戶安全性”部分中集成Firebase身份驗證,以細化每個用戶文件的訪問。