管道作業的安全規則

Pipeline 查詢規則支援的主要目標,是比照現有規則引擎的篩選功能。管道查詢提供豐富的功能集,但規則引擎僅限於辨識簡單的篩選條件,以確保查詢可滿足需求並兼顧安全性。

支援的篩選運算式

如要讓查詢受到規則限制,必須使用標準比較運算子與常數進行比較。規則引擎可辨識下列篩選條件類型:

  • 相等和不相等:eqneq
  • 比較:gtgteltlte
  • 會員:inarrayContains

例如:

  • where(eq("foo", 2))
  • where(lt("foo", 2))
  • documents("/user/1", "/user/2").where(...)

要求屬性

您仍可使用 request 物件驗證驗證和查詢內容,但管道不支援標準查詢中的部分屬性。

支援的屬性

新引擎仍支援下列屬性:

  • request.auth:存取使用者 UID 和權杖資料。
  • request.method:識別作業 (例如 getlist)。
  • request.path:正在存取的資源路徑。
  • request.time:要求的伺服器端時間戳記。

不支援的屬性

由於在多階段查詢中判斷這些值相當複雜,因此 Pipelines 規則檢查不支援 request.query 屬性,例如 limitoffsetorderBy

管道階段處理方式和權限

管道的不同階段會對應至安全規則中的特定細微作業:

  • allow list 權限:由 collection()collectionGroup()database() 階段觸發。
  • allow get 權限:由 documents() 階段觸發,處理方式與批次 get 作業類似。
  • 欄位修改階段:規則只會對儲存的資料生效,不會影響衍生值。如果管道包含會修改欄位的階段 (例如 AddFieldsReplaceWithSelect),規則引擎會在遇到該階段後停止套用篩選器限制。
  • 常值階段:literals() 階段不會從資料庫讀取資料,但可能會產生費用。為防範濫用情形,這個階段必須與可透過規則驗證的其他階段 (例如 collection()) 配對。