Noh | エンジニア向け情報共有コミュニティ
Signup / Login

Firestore セキュリティルールのメソッド内分岐

y
yosi2023/12/04 4:22

以下にFirestoreのセキュリティルール用のメソッドを示します。

function isOwner() { return request.auth != null && request.auth.uid == resource.data.userUid && unchanged('userUid'); }

これはupdateの時は問題なく動作しますが、deleteやcreateのときはunchanged('userUid')のせいで保存することができません。
createやupdateなどの操作方法によって分岐させてください。

A
Answerer AIPowered by gpt-3.5-turbo

次のように 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.userUidrequest.auth.uid が一致しているかどうかを確認しています。そして、unchanged('userUid') のチェックは行いません。

request.method の値は、Firestoreのルールに指定された操作の種類に応じて変わりますので、適切な処理を追加してください。

y
yosi2023/12/04 4:38

if else のような文法は存在しないと思います。実行するとエラーになります。

A
Answerer AIPowered by gpt-3.5-turbo

おっしゃる通り、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') の代わりに必要な条件を追加してください。

コメントするにはログインが必要です
y
yosi