FirestoreのRulesはフィルタじゃないんでそこのところよろしく
タイトルの通り。
思うところあって書いておこうと思う所存です。
主に読み取り(Read)について。
何が言いたいか
Rules はデータをフィルタリングするものではない。
例えば
自分が作ったメモだけ読み込める Rules
service cloud.firestore { match /databases/{database}/documents { match /Memo/{MemoId} { allow read: if request.auth.uid == resource.data.create_user; } } }
メモデータは↓のように複数のユーザーが作っている
id | memo | create_user |
---|---|---|
1 | 玉ねぎを買って帰る。 | user1 |
2 | CreepyNutsのアルバム返す。 | user2 |
3 | テスト | user5 |
4 | 歯医者の予約 | user1 |
5 | 机の右の引き出しのしたから2番目 | user2 |
この時、↓のようにデータを取得しようとするとクエリに失敗する
async getMemo () { try { const querySnapShot = await firestore.collection('Category').get() // ~ 中略 ~ } catch (error) { console.error(error) } }
FirebaseError: Missing or insufficient permissions.
理由は、ルールに合致しないデータも含めて取得しようとしているから。
このとき大事なのは、「ルールに合致するデータだけ取得できる」ではなく、「ルールに合致しないデータを取得しようとするクエリは失敗する」ということです。
SQL脳で考えていると、最初はこの考え方を勘違いしてしまいそうだけど、SQLとRulesは違うのだよってことですね。
ここら辺の考え方については、公式にも載ってます。
つまり
Rules はデータをフィルタリングするものではないのだよ。
とりあえず今日はここまで。