パイプライン オペレーションのセキュリティ ルール

パイプライン クエリのルールをサポートする主な目的は、既存のルールエンジンのフィルタリング機能を一致させることです。パイプライン クエリは豊富な機能を提供しますが、ルールエンジンはクエリの充足性とセキュリティを確保するために、単純なフィルタのみ認識するように制限されています。

サポートされているフィルタ式

クエリをルールで制約するには、定数に対して標準の比較演算子を使用する必要があります。ルールエンジンで認識されるフィルタタイプは次のとおりです。

  • 等式と不等式: 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: リクエストのサーバーサイドのタイムスタンプ。

サポートされていないプロパティ

limitoffsetorderBy などの request.query プロパティは、マルチステージ クエリでこれらの値を特定する複雑さのため、パイプライン ルールチェックではサポートされていません。

パイプライン ステージの処理と権限

セキュリティ ルールの特定の細かなオペレーションにマッピングされるパイプライン ステージは次のとおりです。

  • allow list 権限: collection()collectionGroup()database() の各ステージでトリガーされます。
  • allow get 権限: バッチ get オペレーションと同様に扱われる documents() ステージによってトリガーされます。
  • フィールド変更ステージ: ルールは保存されたデータに対してのみ動作し、派生値に対しては動作しません。パイプラインにフィールドを変更するステージ(AddFieldsReplaceWithSelect など)が含まれている場合、ルールエンジンは、そのステージが検出された後、フィルタ制約の適用を停止します。
  • リテラル ステージ: literals() ステージはデータベースから読み取りませんが、費用が発生する可能性があります。不正使用を防ぐため、ルールで検証できる別のステージ(collection() など)とペアにする必要があります。