Firestoreで現在以下のような構成をしています。
/posts/{id}
に表示するデータを格納している/admin_users/{uID}
には特定のユーザーのuIDが登録されている
そして、以下のようなことをルールで設定したいのです。
/posts/{id}
にあるドキュメントはログインさえしていればreadできる/posts/{id}
は/admin_users/{uid}
に自身のuIDと同じドキュメントが存在していればwriteできる
(例:/admin_users/
にhogehogeUserID
というドキュメントのみが存在する場合、hogehogeUserID
というuIDを持つユーザーは/posts/{id}
を編集できる。exampleUserID
のuIDを持つユーザーは編集できない。)
そして以下のようなルールを記述しました。
service cloud.firestore { match /databases/{database}/documents { function isAuthenticated() { return request.auth != null; } function isAdmin(){ return exists(path('/databases/$(database)/documents/admin_users/' + request.auth.uid)) } match /admin_users/{uID}{ allow read: if isAuthenticated() && isAdmin() } match /posts/{id} { allow read: if isAuthenticated() allow write: if isAdmin(); } } }
現在、/admin_users/
にはhogehogeUserID
のみが存在しています。シミュレータで認証済み項目の[Firebase uID]欄にhogehogeUserID
と入力し、実行すると問題なくwrite権限が得られます。
しかし、実際の動作環境では権限が得られずエラーになります。
FirebaseError: Missing or insufficient permissions.
(実環境でもuIDはhogehogeUserID
であると考えてください)
isAdmin()
を外すと問題なく動作するので、function isAdmin()
が悪さをしているのはわかったのですが、これのどこが問題かはわかりません。
ご教授のほど、よろしくお願いします。
追記:
Function isAdmin()を以下のように編集しても、同様にシミュレータでは動作し、実働しません。
function isAdmin(){ return exists(path('/databases/$(database)/documents/admin_users/hogehogeUserID' ))//' + request.auth.uid)) //この場合、シミュレータ上ではFirebase uIDが未入力でも書き込み権限を得られる }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。