本頁面由 Cloud Translation API 翻譯而成。
Switch to English

了解Firebase實時數據庫規則

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

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

規則類型
。讀 描述是否以及何時允許用戶讀取數據。
。寫 描述是否以及何時允許寫入數據。
.validate 定義格式正確的值的外觀,是否具有子屬性以及數據類型。
.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"]
    }
  }
}

下一步