「Firebase Security Rules」可讓你控管已儲存資料的存取權。彈性規則 語法意味著您可以建立規則來比對任何內容,不論是所有寫入或 對特定文件執行多項作業
本指南將說明一些您可能想使用的基本用途。 導入。不過,在您準備 開始撰寫規則,您可能會想進一步瞭解 語言及行為。
如要存取及更新規則,請按照 管理及部署 Firebase Security Rules。
預設規則:鎖定模式
在 Firebase 主控台中建立資料庫或儲存空間執行個體時,您可以選擇 Firebase Security Rules 是否限制資料存取權 (鎖定模式),或是允許任何人存取 (測試模式)。在Cloud Firestore和 Realtime Database,鎖定模式的預設規則禁止使用者存取所有使用者。 在 Cloud Storage 中,只有經過驗證的使用者可以存取儲存空間值區。
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Realtime Database
{
"rules": {
".read": false,
".write": false
}
}
Cloud Storage
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
開發環境規則
處理應用程式時,您可能會希望應用程式保持開放或不穩定 存取資料。只要確保在將應用程式部署至正式版前更新 Rules 即可。此外請注意,如果您部署應用程式 無論是否啟動,都會公開存取。
提醒您,Firebase 可讓客戶直接存取您的資料,且 Firebase Security Rules是唯一針對惡意使用者封鎖存取權的保護措施。定義 和產品邏輯分開的規則有許多好處 負責強制執行安全性的工作,而採用錯誤實作並不會破壞 最重要的是,您並非依賴中介伺服器 保護世界各地的資料
所有已驗證的使用者
我們不建議您讓 登入帳戶後,您就能將存取權授予任何 已驗證的使用者 可協助你開發應用程式
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
Realtime Database
{
"rules": {
".read": "auth.uid !== null",
".write": "auth.uid !== null"
}
}
Cloud Storage
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
可用於實際工作環境的規則
準備部署應用程式時,請確認您的資料受到妥善保護, 妥善授予使用者存取權善用 Authentication:設定使用者層級存取權及直接讀取 設定以資料為基礎的存取權
建議您在建立資料結構時撰寫規則, 您設定的規則會影響您對 路徑。
僅限內容擁有者存取
這些規則只允許經過驗證的內容擁有者存取。 僅限單一使用者讀取和寫入資料,而資料路徑包含 使用者 ID
這項規則適用的情況:如果資料是按使用者分隔,也就是只有建立資料的使用者才能存取資料,這項規則就很實用。
這項規則適用的情況:有多位使用者時,這項規則集無法運作 需要寫入或讀取相同的資料 — 使用者會覆寫資料,或是無法 存取先前建立的資料
如何設定這項規則:建立規則,確認使用者要求存取權 讀取或寫入資料的擁有者為該資料的擁有者。
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// Allow only authenticated content owners access
match /some_collection/{userId}/{documents=**} {
allow read, write: if request.auth != null && request.auth.uid == userId
}
}
}
Realtime Database
{
"rules": {
"some_path": {
"$uid": {
// Allow only authenticated content owners access to their data
".read": "auth !== null && auth.uid === $uid",
".write": "auth !== null && auth.uid === $uid"
}
}
}
}
Cloud Storage
// Grants a user access to a node matching their user ID
service firebase.storage {
match /b/{bucket}/o {
// Files look like: "user/<UID>/path/to/file.txt"
match /user/{userId}/{allPaths=**} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
混合式公開與私人存取
這項規則允許任何人讀取資料集,但只允許已驗證的內容擁有者在特定路徑中建立或修改資料。
適用情況:如果應用程式需要可供大眾閱讀的元素,但需要限制這些元素擁有者的編輯存取權,這項規則就很實用。例如即時通訊應用程式或網誌。
不適用情況:與僅限內容擁有者的規則一樣,當多名使用者需要編輯相同資料時,這組規則就無法運作。使用者最終會彼此覆寫資料。
如何設定這項規則:建立規則,為所有使用者啟用讀取權限 (或所有已驗證使用者),並確認使用者寫入資料為擁有者。
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// Allow public read access, but only content owners can write
match /some_collection/{document} {
allow read: if true
allow create: if request.auth.uid == request.resource.data.author_uid;
allow update, delete: if request.auth.uid == resource.data.author_uid;
}
}
}
Realtime Database
{
// Allow anyone to read data, but only authenticated content owners can
// make changes to their data
"rules": {
"some_path": {
"$uid": {
".read": true,
// or ".read": "auth.uid !== null" for only authenticated users
".write": "auth.uid === $uid"
}
}
}
}
Cloud Storage
service firebase.storage {
match /b/{bucket}/o {
// Files look like: "user/<UID>/path/to/file.txt"
match /user/{userId}/{allPaths=**} {
allow read;
allow write: if request.auth.uid == userId;
}
}
}
屬性型和角色型存取權
為了讓這些規則順利運作,您必須定義屬性並指派給 資料。「Firebase Security Rules」會根據資料庫或檔案的資料檢查要求 來確認或拒絕存取作業的中繼資料
這項規則的運作方式:當您指派角色給使用者時,這項規則會 可根據角色或特定使用者群組來限制存取權。舉例來說,如果您要儲存成績,可以為「學生」群組 (僅可讀取自己的內容)、「老師」群組 (可讀取及寫入自己的科目) 和「校長」群組 (可讀取所有內容) 指派不同的存取層級。
這項規則不適用時:在 Realtime Database 和 Cloud Storage 中,您的規則
無法使用 Cloud Firestore 規則可納入的 get()
方法。
因此,你必須建構資料庫或檔案中繼資料
您在規則中使用的屬性。
如何設定這項規則:在 Cloud Firestore 中,為使用者加入欄位 可讀取的文件 然後規劃規則結構 並在特定情況下授予存取權在 Realtime Database 中,建立資料路徑。 定義應用程式的使用者,並在子節點中授予他們角色。
你也可以在 Authentication 中設定自訂著作權聲明
然後在 Deployment 套件中
任何 Firebase Security Rules 中的 auth.token
變數。
資料定義的屬性和角色
這些規則僅適用於 Cloud Firestore 和 Realtime Database。
Cloud Firestore
請記住,只要您的規則中包含讀取作業,例如下列規則 系統會向您收取 Cloud Firestore 的讀取作業費用。
service cloud.firestore {
match /databases/{database}/documents {
// For attribute-based access control, Check a boolean `admin` attribute
allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
allow read: true;
// Alterntatively, for role-based access, assign specific roles to users
match /some_collection/{document} {
allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"
}
}
}
Realtime Database
{
"rules": {
"some_path": {
"${subpath}": {
//
".write": "root.child('users').child(auth.uid).child('role').val() === 'admin'",
".read": true
}
}
}
}
自訂聲明的屬性和角色
如要導入這些規則,請設定自訂憑證附加資訊 ,Firebase Authentication然後使用規則中的聲明。
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// For attribute-based access control, check for an admin claim
allow write: if request.auth.token.admin == true;
allow read: true;
// Alterntatively, for role-based access, assign specific roles to users
match /some_collection/{document} {
allow read: if request.auth.token.reader == "true";
allow write: if request.auth.token.writer == "true";
}
}
}
Realtime Database
{
"rules": {
"some_path": {
"$uid": {
// Create a custom claim for each role or group
// you want to leverage
".write": "auth.uid !== null && auth.token.writer === true",
".read": "auth.uid !== null && auth.token.reader === true"
}
}
}
}
Cloud Storage
service firebase.storage {
// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/{groupId}/{fileName} {
allow read: if resource.metadata.owner == request.auth.token.groupId;
allow write: if request.auth.token.groupId == groupId;
}
}
用戶群屬性
如要導入這些規則,請在 Google Cloud Identity Platform (GCIP) 中設定多租戶架構
然後在規則中利用這個用戶群下列範例允許寫入
特定用戶群中的特定使用者存取權tenant2-m6tyz
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// For tenant-based access control, check for a tenantID
allow write: if request.auth.token.firebase.tenant == 'tenant2-m6tyz';
allow read: true;
}
}
Realtime Database
{
"rules": {
"some_path": {
"$uid": {
// Only allow reads and writes if user belongs to a specific tenant
".write": "auth.uid !== null && auth.token.firebase.tenant === 'tenant2-m6tyz'",
".read": "auth.uid !== null
}
}
}
}
Cloud Storage
service firebase.storage {
// Only allow reads and writes if user belongs to a specific tenant
match /files/{tenantId}/{fileName} {
allow read: if request.auth != null;
allow write: if request.auth.token.firebase.tenant == tenantId;
}
}