パイプライン クエリのルールをサポートする主な目的は、既存のルールエンジンのフィルタリング機能を一致させることです。パイプライン クエリは豊富な機能を提供しますが、ルールエンジンはクエリの充足性とセキュリティを確保するために、単純なフィルタのみ認識するように制限されています。
サポートされているフィルタ式
クエリをルールで制約するには、定数に対して標準の比較演算子を使用する必要があります。ルールエンジンで認識されるフィルタタイプは次のとおりです。
- 等式と不等式:
eq、neq - 比較:
gt、gte、lt、lte - メンバーシップ:
in、arrayContains
次に例を示します。
where(eq("foo", 2))where(lt("foo", 2))documents("/user/1", "/user/2").where(...)
リクエストのプロパティ
request オブジェクトは引き続き認証とクエリ コンテキストの検証に使用できますが、標準クエリで使用できるプロパティの一部はパイプラインでサポートされていません。
サポートされているプロパティ
新しいエンジンは、引き続き次のプロパティをサポートします。
request.auth: ユーザーの UID とトークンデータにアクセスします。request.method: オペレーションを識別します(get、listなど)。request.path: アクセスされているリソースのパス。request.time: リクエストのサーバーサイドのタイムスタンプ。
サポートされていないプロパティ
limit、offset、orderBy などの request.query プロパティは、マルチステージ クエリでこれらの値を特定する複雑さのため、パイプライン ルールチェックではサポートされていません。
パイプライン ステージの処理と権限
セキュリティ ルールの特定の細かなオペレーションにマッピングされるパイプライン ステージは次のとおりです。
allow list権限:collection()、collectionGroup()、database()の各ステージでトリガーされます。allow get権限: バッチgetオペレーションと同様に扱われるdocuments()ステージによってトリガーされます。- フィールド変更ステージ: ルールは保存されたデータに対してのみ動作し、派生値に対しては動作しません。パイプラインにフィールドを変更するステージ(
AddFields、ReplaceWith、Selectなど)が含まれている場合、ルールエンジンは、そのステージが検出された後、フィルタ制約の適用を停止します。 - リテラル ステージ:
literals()ステージはデータベースから読み取りませんが、費用が発生する可能性があります。不正使用を防ぐため、ルールで検証できる別のステージ(collection()など)とペアにする必要があります。