我正在编写一个笔记共享应用程序,我正试图找到数据结构的最佳方法,以允许将协作者添加到用户注释中,同时为该结构提供合理的安全规则问题
我现在拥有以下内容:
"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
节点中写入),但是这会大大增加列出用户有权访问的所有注释的复杂性。 / p>
答案 0 :(得分:0)
你想:
- 允许添加所有者&合作者注意用户注释。
- 列出用户拥有的所有笔记。
- 列出用户有权访问的所有笔记。
醇>
您应该在每个备注中添加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?