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

基本安全規則

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

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

要訪問和更新您的規則,請按照“ 管理和部署Firebase安全規則”中概述的步驟進行操作。

默認規則:鎖定模式

在Firebase控制台中創建數據庫或存儲實例時,您可以選擇Firebase安全規則是限制對數據的訪問( 鎖定模式 )還是允許任何人訪問( 測試模式 )。在Cloud Firestore和實時數據庫中, 鎖定模式的默認規則拒絕所有用戶的訪問。在存儲中,只有經過身份驗證的用戶才能訪問存儲桶。

Cloud Firestore

 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安全規則是阻止惡意用戶訪問的唯一保障。與產品邏輯分開定義規則具有許多優點:客戶端不負責強制執行安全性,錯誤的實現不會破壞您的數據,最重要的是,您不依賴中間服務器來保護數據免受外界攻擊。

所有通過身份驗證的用戶

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

Cloud Firestore

 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。

該規則何時起作用:如果數據被用戶隔離,則該規則很好地起作用-如果唯一需要訪問數據的用戶是創建數據的同一用戶。

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

要設置此規則,請執行以下操作:創建一條規則,以確認請求訪問讀取或寫入數據的用戶是擁有該數據的用戶。

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

實時數據庫

 {
  "rules": {
    "some_path": {
      "$uid": {
        // Allow only authenticated content owners access to their data
        ".read": "request.auth != null && request.auth.uid == $uid"
        ".write": "request.auth != null && request.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;
    }
  }
}
 

公共和私人混合訪問

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

當此規則有效時:該規則適用於需要公開可讀元素的應用程序,但需要將編輯訪問權限限制為這些元素的所有者。例如,聊天應用程序或博客。

當此規則不起作用時:與僅內容所有者規則一樣,當多個用戶需要編輯同一數據時,​​此規則集也不起作用。用戶最終將覆蓋彼此的數據。

要設置此規則,請執行以下操作:創建一個規則,以對所有用戶(或所有經過身份驗證的用戶)啟用讀取訪問權限,並確認寫入數據的用戶是所有者。

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

實時數據庫

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

該規則何時起作用:如果您要為用戶分配角色,則此規則使根據角色或特定用戶組限制訪問權限變得容易。例如,如果要存儲成績,則可以為“學生”組(僅讀取其內容),“教師”組(在其學科中讀寫)和“主要”組(讀取)分配不同的訪問級別。所有內容)。

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

要設置此規則,請執行以下操作:在Cloud Firestore中,在用戶文檔中包含一個您可以閱讀的字段,然後構造規則以讀取該字段並有條件地授予訪問權限。在“實時數據庫”中,創建一個數據路徑,該路徑定義應用程序的用戶並授予他們在子節點中的角色。

您還可以在Authentication中設置自定義聲明 ,然後在任何Firebase安全規則中從auth.token變量檢索該信息。

數據定義的屬性和角色

這些規則僅適用於Cloud Firestore和實時數據庫。

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

自定義聲明屬性和角色

要實施這些規則,請在Firebase身份驗證中設置自定義聲明 ,然後利用規則中的聲明。

雲消防站

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