基本安全性規則

Firebase Security Rules」可讓你控管已儲存資料的存取權。彈性規則 語法意味著您可以建立規則來比對任何內容,不論是所有寫入或 對特定文件執行多項作業

本指南將說明一些您可能想使用的基本用途。 導入。不過,在您準備 開始撰寫規則,您可能會想進一步瞭解 語言行為

如要存取及更新規則,請按照 管理及部署 Firebase Security Rules

預設規則:鎖定模式

Firebase 主控台中建立資料庫或儲存空間執行個體時,您可以選擇 Firebase Security Rules 是否限制資料存取權 (鎖定模式),或是允許任何人存取 (測試模式)。在Cloud FirestoreRealtime 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 DatabaseCloud Storage 中,您的規則 無法使用 Cloud Firestore 規則可納入的 get() 方法。 因此,你必須建構資料庫或檔案中繼資料 您在規則中使用的屬性。

如何設定這項規則:Cloud Firestore 中,為使用者加入欄位 可讀取的文件 然後規劃規則結構 並在特定情況下授予存取權在 Realtime Database 中,建立資料路徑。 定義應用程式的使用者,並在子節點中授予他們角色。

你也可以Authentication 中設定自訂著作權聲明 然後在 Deployment 套件中 任何 Firebase Security Rules 中的 auth.token 變數。

資料定義的屬性和角色

這些規則僅適用於 Cloud FirestoreRealtime 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;
  }
}