0

自分のデータへの管理者アクセス権を許可しようとしています。 私はこのようなデータベースの構造を有する:Firebaseデータベースルールの管理者アレイへのアクセスを許可するにはどうすればいいですか

{ 
    "Respondents": { 
     "Acme Corp": { 
      "admins": ["mMK7eTrRL4UgVDh284HntNRETmx1", ""mx1TERNmMK7eTrRL4UgVDh284Hnt"], 
      "data": {data goes here...} 
     }, 
     "Another Inc": { 
      "admins": ["Dh284HmMK7eTrRL4UgVDh284HntN", ""x1TERNmx1TERNmMK7eTrRL4UgVDh"], 
      "data": {their data goes here...} 
     } 
    } 
} 

をそして私は私が得るFirebase Databaseルールエディタ に解析できないだろう、この

{ 
    "rules": { 
    "Respondents": { 
     "$organisation" : { 
     ".read": "root.child('Respondents').child($organisation).child('admins').val().includes(auth.id)", 
     ".read": "root.child('Respondents').child($organisation).child('admins').val().includes(auth.id)" 
     } 
    } 
    } 
} 

..butように私のルールを設定しようとしました"エラー保存ルール - 行7:そのようなメソッド/プロパティ ''には ''が含まれていますが、ユーザーIDと管理者の配列を一致させる必要があります。 経験や提案はありますか?

+0

質問と回答の両方で、小さな、しかし重要な誤りに気づいた:

今、あなたは、関連するUID を持つキーがadmins下(代わりに、それは価値が含まれているかどうかをチェックする)が存在するかどうかをテストすることができます。 auth.id does not work。それは:auth.uid –

答えて

1

Firebaseのセキュリティルールには、includes()の操作はありません。これは、Firebaseが実際にデータを配列として格納しないためです。

"admins": { 
    "0": "mMK7eTrRL4UgVDh284HntNRETmx1", 
    "1": "mx1TERNmMK7eTrRL4UgVDh284Hnt" 
} 

をそして、それは通常のJavaScriptオブジェクトであるため、それには方法がありません:あなたはFirebase Database consoleに見えるかthis blog postを読む場合は、通常のオブジェクトとそのFirebase格納し、それを見ることができます。

一般的に、アレイの作成は、Firebaseデータベースのアンチパターンです。それらはしばしば間違ったデータ構造であり、使用されるとスケーラビリティ問題の主な原因が定期的に発生します。

この場合、あなたは本当に一連のUIDを保存するつもりはありません。実際、UIDの順序は重要ではなく、それぞれのUIDはコレクションに意味的に一度しか存在できません。したがって、配列の代わりにを設定して、のUIDを格納します。値はあまり重要ではありません

"admins": { 
    "mMK7eTrRL4UgVDh284HntNRETmx1": true, 
    "mx1TERNmMK7eTrRL4UgVDh284Hnt": true 
} 

:あなたはこの構造体を使用Firebaseでセットを実装する

。しかし、キーを格納するための値が必要なので、trueを使用するのは慣用的です。

"root.child('Respondents').child($organisation).child('admins').child(auth.uid).exists()", 
+0

あなたの男をフランク!問題を解決するだけでなく、ベストプラクティスを説明してくれてありがとう –

+0

質問と回答の両方で、小さくても重要なエラーに気づいた。auth.id does not work。それは:auth.uid –

+0

良いキャッチ!私は答えでそれを修正しました。 –

関連する問題