Firebase:协作应用的安全规则

时间:2016-05-03 10:59:32

标签: firebase rules firebase-security firebase-realtime-database

我正在编写一个笔记共享应用程序,我正试图找到数据结构的最佳方法,以允许将协作者添加到用户注释中,同时为该结构提供合理的安全规则问题

我现在拥有以下内容:

"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节点中写入),但是这会大大增加列出用户有权访问的所有注释的复杂性。 / p>

1 个答案:

答案 0 :(得分:0)

  

你想:

     
      
  1. 允许添加所有者&合作者注意用户注释。
  2.   
  3. 列出用户拥有的所有笔记。
  4.   
  5. 列出用户有权访问的所有笔记。
  6.   

您应该在每个备注中添加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?