Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

了解 Firebase 實時數據庫規則

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

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

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

實時數據庫安全概述

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

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

驗證

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

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

授權

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

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

.read.write規則級聯,所以這個規則集授予讀取在路徑訪問任何數據/foo/以及任何更深的路徑如/foo/bar/baz 。需要注意的是.read.write數據庫覆蓋規則淺更深的規則,所以要讀訪問/foo/bar/baz仍然會在這個例子中授予即使在路徑規則/foo/bar/baz結果為假。

實時數據庫安全規則包括內置變量和函數,使您可以參考其他路徑,服務器端的時間戳,認證信息,等等。這裡的一個規則的一個例子授予寫入用於認證的用戶訪問/users/<uid>/ ,其中<UID>是通過火力地堡認證所獲得的用戶的ID。

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

數據驗證

Firebase 實時數據庫是無模式的。這使您在開發過程中可以輕鬆更改內容,但是一旦您的應用程序準備好分發,數據保持一致就很重要。規則語言包括.validate規則,讓你通過使用相同的表達式來應用驗證邏輯.read.write規則。唯一的區別是,驗證規則不級聯,所以被允許寫所有相關的驗證規則必須為真才能。

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

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

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

定義數據庫索引

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

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

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

下一步