質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Q&A

解決済

1回答

328閲覧

Firestoreのルール設定でシミュレータでは動作するのに実働しない

tsurugi

総合スコア89

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

0グッド

0クリップ

投稿2019/05/24 02:03

編集2019/05/24 02:36

Firestoreで現在以下のような構成をしています。

  1. /posts/{id}に表示するデータを格納している
  2. /admin_users/{uID}には特定のユーザーのuIDが登録されている

そして、以下のようなことをルールで設定したいのです。

  1. /posts/{id}にあるドキュメントはログインさえしていればreadできる
  2. /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が未入力でも書き込み権限を得られる }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

上記記事に全く同じパターンがあったのですが、以下のようにすることで解決しました。上記記事筆者に感謝します。

function isAdmin(){ return exists(path('/databases/$(database)/documents/admin_users/$(request.auth.uid)')) }

投稿2019/05/24 02:41

tsurugi

総合スコア89

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問