たとえば、対象となるレコードに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。