2016-05-03 5 views
3

私はメモ共有アプリケーションを作成しています。同時に、合理的なセキュリティルールを持つと同時に、共同編集者をユーザーノートに追加できるようにするための最良の方法を探しています問題の構造については、私が今持っている何Firebase:コラボレーションアプリケーションのセキュリティルール

は以下の通りです:「ジョン・ドウ」は、ノートを作成すると

"users": { 
    "johndoe": { 
     "notes": { 
     "note1Key", 
     "note2Key" 
     } 
    }, 
    "jane": { 
     "notes": { 
     "note3Key", 
     "note4Key", 
     "note5Key" 
     } 
    } 
    ... 
}, 
"notes": { 
    "note1Key": { 
    // actual note data 
    }, 
    "note2Key": { 
    // actual note data 
    }, 
    "note3Key": { 
    // actual note data 
    }, 
    ... 
}, 
"shared": { 
    "johndoe" : { 
     "note5Key" : true, 
     "note3Key" : true 
    }, 
    "jane" : { 
     "note1Key" : true 
    } 
    ... 
} 

、ノートが所有者と掲載した協力者に付与された読み取り/書き込みアクセスをnotes/noteKeyに格納されます。さらに、ノートの鍵はuser/johndoe/notes/noteKeyに保存されています。この鍵は、彼によってのみ読み書きできます。このユーザが自分のメモに共同編集者(「Jane」)を追加したい場合、この同じメモキーはshared/jane/noteKeyに保存され、&に書き込まれます。この方法では、各ユーザーのメモをリストするときに、ユーザーがアクセスできるすべてのメモを一覧表示するために2つの場所から読む必要があります:user/johndoe/notesshared/johndoe

良いアプローチがありますか?私はsharedインデックスをグローバルにアクセスできるようにしたくないのですが、何とかそれを制限できますか? 1人のユーザーが異なるノートで多数の異なるユーザーと共同作業する可能性があるため、セキュリティルールを設定する方法、このインデックスへの読み取り/書き込みアクセスを制限する方法はわかりません。

sharedノードロジックを逆転させ、ノートキーを尊重している所有者のサブノードの下に保存し、協力者のリストを含むように考えました:shared/jane/noteKey/collaborators/johndoe。このようにして、グローバル読み取りルールとより限定的な書き込みルール(各ユーザーは自分のsharedノードでのみ書き込み可能)を持つことができますが、ユーザーがアクセスするすべてのメモをリストする複雑さが大幅に増加します。あなたがしたかった

答えて

0

  1. は、ユーザーのノートを所有者&協力者を追加することができます。
  2. ユーザーが所有するすべてのメモを一覧表示します。
  3. ユーザーがアクセスできるすべてのメモを一覧表示します。

次のようにして、各ノートにcollaboratorsリストを追加しておく必要があります
Firebase rule: Do we have better ways to manage object ownership?

{"rules":{ 

    "users": { 
    "$user_id": { 
     "profile_and_settings":{ 
      ".write":"auth != null && auth.uid == $user_id" 
     }, 
     "owned_notes":{ 
      ".write":"auth != null && auth.uid == $user_id", 
      "$note_id":{} 
     }, 
     "accesssible_notes": { 
      ".write":"auth != null", 
      "$note_id":{} 
     } 
    } 
    }, 

    "notes": { 
    "$note_id": { 

     // to edit this node: must authenticated, new entry or owner of this node. 
     ".write":"auth != null && (!data.exists() || data.child('owner').val() == auth.uid)", 

     "owner":{ 
      ".validate":"newData.val() == auth.uid" 
     }, 

     "collaborators":{ 
      "$user_id":{} 
     }, 

     // ... other note data 

    } 
    //... 
    } 
}} 

は、関連の質問を参照してください

関連する問題