我正在编写一个便笺共享应用程序,并且试图为数据结构找到最佳方法,以允许向用户便笺中添加协作者,同时对所讨论的结构具有明智的安全性规则。
我现在所拥有的是:
"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/notes
和shared/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/