了解 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讀取存取權限,即使路徑/foo/bar/baz處的規則評估為false。

即時資料庫安全性規則包括內建變數和函數,可讓您引用其他路徑、伺服器端時間戳記、身份驗證資訊等。以下是向經過驗證的使用者授予對/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"]
    }
  }
}

下一步