了解 Firebase 實時數據庫規則

Firebase 實時數據庫安全規則確定誰對您的數據庫具有讀寫訪問權限、數據的結構方式以及存在哪些索引。這些規則存在於 Firebase 服務器上,並始終自動執行。只有在您的規則允許的情況下,才會完成每個讀寫請求。默認情況下,您的規則不允許任何人訪問您的數據庫。這是為了保護您的數據庫免受濫用,直到您有時間自定義規則或設置身份驗證。

實時數據庫安全規則具有類似 JavaScript 的語法,有四種類型:

規則類型
。讀描述是否以及何時允許用戶讀取數據。
。寫描述是否以及何時允許寫入數據。
。證實定義格式正確的值的外觀、是否具有子屬性以及數據類型。
.indexOn指定要索引的子項以支持排序和查詢。

實時數據庫安全概述

Firebase 實時數據庫提供了一整套用於管理應用安全性的工具。這些工具使驗證您的用戶、強制執行用戶權限和驗證輸入變得容易。

與許多其他技術堆棧相比,基於 Firebase 的應用運行的客戶端代碼更多。因此,我們處理安全性的方式可能與您習慣的有所不同。

驗證

保護您的應用程序的常見第一步是識別您的用戶。這個過程稱為身份驗證。您可以使用Firebase 身份驗證讓用戶登錄您的應用。 Firebase 身份驗證包括對 Google 和 Facebook 等常見身份驗證方法的直接支持,以及電子郵件和密碼登錄、匿名登錄等。

用戶身份是一個重要的安全概念。不同的用戶有不同的數據,有時他們有不同的能力。例如,在聊天應用程序中,每條消息都與創建它的用戶相關聯。用戶也可以刪除他們自己的消息,但不能刪除其他用戶發布的消息。

授權

識別您的用戶只是安全的一部分。一旦您知道他們是誰,您就需要一種方法來控制他們對數據庫中數據的訪問。實時數據庫安全規則允許您控制每個用戶的訪問。例如,這裡有一組安全規則,允許任何人讀取路徑/foo/ ,但沒有人可以寫入:

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

.read.write規則級聯,因此此規則集授予對路徑/foo/以及任何更深層路徑(例如/foo/bar/baz )的任何數據的讀取訪問權限。請注意,數據庫中較淺的.read.write規則會覆蓋較深的規則,因此即使路徑/foo/bar/baz的規則評估為 false,在此示例中仍將授予對/foo/bar/baz的讀取訪問權限。

實時數據庫安全規則包括允許您引用其他路徑、服務器端時間戳、身份驗證信息等的內置變量和函數。下面是一個規則示例,該規則授予經過身份驗證的用戶對/users/<uid>/的寫入權限,其中 <uid> 是通過 Firebase 身份驗證獲得的用戶 ID。

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

數據驗證

Firebase 實時數據庫是無模式的。這使得在開發過程中更改內容變得很容易,但是一旦您的應用程序準備好分發,數據保持一致就很重要。規則語言包括一個.validate規則,它允許您使用用於.read.write規則的相同表達式應用驗證邏輯。唯一的區別是驗證規則不會級聯,因此所有相關的驗證規則必須評估為 true 才能允許寫入。

這些規則強制寫入/foo/的數據必須是少於 100 個字符的字符串:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

驗證規則可以訪問所有與.read.write規則相同的內置函數和變量。您可以使用這些來創建驗證規則,以了解數據庫中其他地方的數據、您的用戶身份、服務器時間等等。

定義數據庫索引

Firebase 實時數據庫允許排序和查詢數據。對於小數據量,數據庫支持即席查詢,所以開發時一般不需要索引。但是,在啟動您的應用程序之前,為您必須確保它們隨著您的應用程序增長而繼續工作的任何查詢指定索引非常重要。

使用.indexOn規則指定索引。這是一個示例索引聲明,它將索引恐龍列表的高度和長度字段:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

下一步