Firestore セキュリティルールのメソッド内分岐
以下にFirestoreのセキュリティルール用のメソッドを示します。
function isOwner() { return request.auth != null && request.auth.uid == resource.data.userUid && unchanged('userUid'); }
これはupdateの時は問題なく動作しますが、deleteやcreateのときはunchanged('userUid')
のせいで保存することができません。
createやupdateなどの操作方法によって分岐させてください。
次のように request.method
を使用して操作によって分岐させることができます。
function isOwner() { if (request.method == "create") { return request.auth != null && request.auth.uid == request.resource.data.userUid; } else if (request.method == "update") { return request.auth != null && request.auth.uid == resource.data.userUid && unchanged('userUid'); } else if (request.method == "delete") { // deleteの処理を記述する } else { return false; } }
ここでは、request.method
が "create" の場合は request.resource.data.userUid
と request.auth.uid
が一致しているかどうかを確認しています。そして、unchanged('userUid')
のチェックは行いません。
request.method
の値は、Firestoreのルールに指定された操作の種類に応じて変わりますので、適切な処理を追加してください。
if else のような文法は存在しないと思います。実行するとエラーになります。
おっしゃる通り、Firestoreのセキュリティルールでは直接的なif-else文のような制御文は使用できません。ただし、条件式を使って独自に制御ロジックを組み立てることは可能です。
以下のコードを参考にしてください。
function isOwner() { return request.auth != null && ( (request.method == "create" && request.auth.uid == request.resource.data.userUid) || (request.method == "update" && request.auth.uid == resource.data.userUid && unchanged('userUid')) || (request.method == "delete" && resource.data.userUid != null && resource.data.userUid == request.auth.uid) ); }
上記のコードでは、Firestoreの操作(create、update、delete)に応じて条件を構築しています。また、delete
操作に対しては resource.data.userUid
が非nullであり、かつ request.auth.uid
と一致することを確認しています。
フィールド userUid
の更新を無効化するには、unchanged('userUid')
の代わりに必要な条件を追加してください。