基本安全規則

Firebase 安全規則允許您控制對存儲數據的訪問。靈活的規則語法意味著您可以創建匹配任何內容的規則,從對整個數據庫的所有寫入到對特定文檔的操作。

本指南介紹了您在設置應用程序和保護數據時可能想要實施的一些更基本的用例。但是,在開始編寫規則之前,你可能想了解更多關於語言他們寫在和他們的行為

訪問和更新您的規則,按照列出的步驟管理和部署火力地堡的安全規則

默認規則:鎖定模式

當您創建的火力地堡控制台數據庫或存儲例如,你選擇你的火力地堡的安全規則是否限制訪問您的數據(鎖定模式),或允許任何人訪問(測試模式)。在雲和的FireStore實時數據庫,用於鎖定模式的默認規則,拒絕所有用戶的訪問。在 Cloud Storage 中,只有經過身份驗證的用戶才能訪問存儲分區。

雲防火牆

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

實時數據庫

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

雲儲存

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

開發環境規則

在開發應用程序時,您可能希望相對開放或不受限制地訪問您的數據。在將應用程序部署到生產環境之前,請務必更新您的規則。還要記住,如果你部署應用程序,它的可公開訪問的-即使你還沒有啟動它。

請記住,Firebase 允許客戶端直接訪問您的數據,而 Firebase 安全規則是阻止惡意用戶訪問的唯一保障措施。將規則與產品邏輯分開定義有許多優點:客戶端不負責實施安全性,有缺陷的實現不會危及您的數據,最重要的是,您不依賴中間服務器來保護數據不受外界影響。

所有經過身份驗證的用戶

雖然我們不建議讓任何已登錄的用戶可以訪問您的數據,但在您開發應用程序時為任何經過身份驗證的用戶設置訪問權限可能會很有用。

雲防火牆

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

實時數據庫

{
  "rules": {
    ".read": "auth.uid != null",
    ".write": "auth.uid != null"
  }
}

雲儲存

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

生產就緒規則

在您準備部署應用程序時,請確保您的數據受到保護,並且該訪問權限已正確授予您的用戶。充分利用認證建立基於用戶的訪問,並直接從數據庫中讀取設置數據基於用戶的訪問。

考慮在構建數據時編寫規則,因為設置規則的方式會影響您在不同路徑上限制對數據的訪問的方式。

僅限內容所有者訪問

這些規則僅限制對經過身份驗證的內容所有者的訪問。數據只能被一個用戶讀寫,數據路徑包含用戶的ID。

當這條規則的作品:這條規則運作良好,如果數據是由用戶孤立的-如果需要訪問數據的唯一用戶是創建的數據相同的用戶。

當這個規則不起作用: -用戶將覆蓋數據或不能,他們已經創建的訪問數據時,多個用戶需要寫入或讀取相同數據此規則集不起作用。

要建立這樣的規則:創建一個規則,確認請求訪問的用戶讀取或寫入數據是擁有該數據的用戶。

雲防火牆

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
    }
  }
}

實時數據庫

{
  "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"
      }
    }
  }
}

雲儲存

// 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;
    }
  }
}

混合公共和私人訪問

此規則允許任何人讀取數據集,但限制只能在經過身份驗證的內容所有者的給定路徑上創建或修改數據的能力。

當這條規則的工作原理:這條規則很好地工作公開要求可讀元素的應用程序,但需要限制這些要素的所有者的編輯權限。例如,聊天應用程序或博客。

當這個規則不起作用:像內容所有者唯一的規則,這個規則集當多個用戶需要編輯相同的數據不能正常工作。用戶最終會覆蓋彼此的數據。

要建立這樣的規則:創建一個規則,允許所有用戶(或所有身份驗證的用戶),並確認用戶寫入數據是所有者的讀訪問。

雲防火牆

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;
    }
  }
}

實時數據庫

{
// 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"
      }
    }
  }
}

雲儲存

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 安全規則根據您的數據庫或文件的元數據中的數據檢查請求,以確認或拒絕訪問。

當這條規則適用:如果你分配一個角色給用戶,這個規則可以很容易地限制訪問基於角色或特定的用戶群。例如,如果您要存儲成績,您可以為“學生”組(僅閱讀他們的內容)、“教師”組(在他們的主題中讀寫)和“校長”組(閱讀他們的內容)分配不同的訪問級別所有內容)。

當這個規則不起作用:在實時數據庫和雲存儲,你的規則不能充分利用get()方法雲規則的FireStore可以合併。因此,您必須構建數據庫或文件元數據以反映您在規則中使用的屬性。

要建立這樣的規則:在雲計算公司的FireStore,包括在用戶的文檔的領域,你可以閱讀,然後組織你的規定看,即場和有條件地授予訪問權限。在實時數據庫中,創建一個數據路徑來定義您的應用程序的用戶並授予他們在子節點中的角色。

您還可以設置在驗證自定義聲明,然後檢索來自該信息auth.token變量在任何火力地堡安全規則。

數據定義的屬性和角色

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

實時數據庫

{
  "rules": {
    "some_path": {
      "${subpath}": {
        //
        ".write": "root.child('users').child(auth.uid).child('role').val() == 'admin'",
        ".read": true
      }
    }
  }
}

自定義聲明屬性和角色

為了實現這些規則,建立自定義聲明中火力地堡認證,然後利用規則中的索賠。

雲防火牆

請記住,只要您的規則包含讀取(如下面的規則),您就需要為 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";
   }
  }
}

實時數據庫

{
  "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"
      }
    }
  }
}

雲儲存

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;
  }
}