我正在编写一个便笺共享应用程序,并且试图为数据结构找到最佳方法,以允许向用户便笺中添加协作者,同时对所讨论的结构具有明智的安全性规则。

我现在所拥有的是:

"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
    }
    ...
}


当“ John Doe”创建便笺时,便笺将存储在notes/noteKey中,并授予所有者和所有者添加的协作者读写权限。另外,笔记的密钥存储在user/johndoe/notes/noteKey中,只有他才能读写。当该用户想要在他的便笺中添加一个协作者(“简”)时,该便笺密钥存储在shared/jane/noteKey中,可以全局对其进行读写。这样,在列出每个用户的注释时,我只需要从2个位置读取即可列出用户有权访问的所有注释:user/johndoe/notesshared/johndoe

有没有更好的方法?我不希望全局访问shared索引,我可以以某种方式限制它吗?由于一个用户可以与大量不同的用户在不同的注释上进行协作,因此我不确定如何设置安全规则来限制对该索引的读/写访问。

我正在考虑反转shared节点逻辑,以将注释键存储在受尊重的所有者子节点下,并包括类似以下协作者的列表:shared/jane/noteKey/collaborators/johndoe。这样,我可以拥有全局读取规则和更严格的写入规则(每个用户只能在自己的shared节点中写入),但是这将大大增加列出用户可以访问的所有笔记的复杂性。

最佳答案

您想要:


允许将所有者和合作者添加到用户注释中。
列出用户拥有的所有注释。
列出用户有权访问的所有注释。



您应该将collaborators列表添加到每个注释中,如下所示:

{"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

    }
    //...
  }
}}


查看相关问题:
Firebase rule: Do we have better ways to manage object ownership?

关于firebase - Firebase:协作应用程序的安全性规则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37002270/

10-10 05:01