firestoreのルールは存在しないレコードに対するクエリにも効く


たとえば、対象となるレコードにclaimというフィールドがある場合、
そのCustomClaimがないとreadできないというようなルールを書くとする。

allow read :if request.auth.uid != null && ((!resource.data.keys().hasAll(['claim']) || request.auth.token[resource.data.claim] == true))

ここで上記のように書くと、大体のケースではうまくいくのだが、
存在しないレコードに対してクエリを投げると、権限不足でエラーになってしまう。
感覚的にはclaimというカラムがないのだから権限無しでもOKにして欲しいものだが、ruleの仕様上NGである。

対応策

    match /hoge/{hogeId} {
      allow read :if request.auth.uid != null && !exists(/databases/$(database)/documents/hoge/$(hogeId))
    }

上記のように、「存在しなければread許可」の条件を足してやればOK。