Firebase安全API - 复杂数据结构 - 如何实施关系?

时间:2014-06-22 14:12:01

标签: firebase angularfire firebase-security

在过去的几周里,我一直在探索Firebase及其构建网络应用的功能,但在安全规则方面,我遇到了一些问题。

我已经在Firebase上构建了一个数据结构,但我不确定它是否符合最佳实践(如果它没有,请随时提出不同的建议):

{   
 "groups" : {
    <GROUP_KEY>
        "name": "",
        "rels": {
            "users": {
                <RELS_USERS_KEY>
                "key":"" (USER_KEY)
            },
            "notes": {
                <RELS_NOTES_KEY>
                "key":"" (NOTE_KEY)
            }
        },
        "isPrivate": true 
},

"users": {
    <USER_KEY>
    "email": "",
    "rels": {
        "friends": {
            <RELS_FRIENDS_KEY>
            "key":"" (USER_KEY)
        }
    },
},

"notes": {
    <NOTE_KEY>
        "title": "",
        "description": "",
        "rels": {
            "files": {
                <RELS_FILES_KEY>
                "key":"" (FILE_KEY)
            }
        }
},

"files": {
    <FILE_KEY>
        "mode": "",
        "url": ""
}
}

申请流程如下:

  • 用户注册:在&#34;用户&#34;;
  • 上创建密钥
  • 重定向到&#34;群组&#34;查看,他应该只显示 在RELS中具有其ID的组>用户,或者有 &#34; isPrivate&#34;:&#34;假&#34;
  • 当用户创建一个组时,会添加一个新组,其ID在RELS&gt;中。用户;
  • 进入群组视图时,应该只能看到RELS中的备注&gt;该小组的说明

其余的逻辑遵循相同的原则,我相信如果我能够理解Firebase安全规则的第一个障碍并将其应用于此案例,我可以完成其余的工作。

我已经尝试了一些规则,但我似乎无法从Web应用程序获得任何反馈,调试这是一个试错过程,并且它不能正常工作

有人能帮助我至少理解它背后的逻辑吗?我已经阅读了他们所有的教程,但它们看起来都很浅薄,没有关于复杂结构的更深层次的例子。

感谢您的帮助。

修改

我已将debug:true标记添加到登录中(感谢@Kato),但我仍然没有收到有关规则的反馈。根据以下规则,我仍然会进入&#34;群组&#34;查看,但没有得到控制台的反馈,登录用户看到他不应该的组:

{
"rules": {
  "groups": {
    ".read": "data.child('rels').child('users/' + auth.user).exists()",
    ".write": "data.child('rels').child('users/' + auth.user).exists()"        
  }
}
}

至于我试过的规则,它们是无数的,但这是最新的规则(仍然没有反馈)。

也许我错过了什么?

再次感谢。

1 个答案:

答案 0 :(得分:0)

规则级联。也就是说,如果任何规则允许读取,那么您以后不能在嵌套子级中撤消它。通过这种方式,您可以编写如下规则:

"$record": {
   // I can write the entire record if I own it
   ".write": "data.child('owner').val() === auth.uid",

   "foo": {
       // anybody in my friends list can write to foo, but not anything else in $record
       ".write": "data.parent().child('friends/'+auth.uid).exists()"
   },

   "bar": {
       // this is superfluous as permissions are only "granted" and never "revoked" by a child
       ".write": false
   }
}

请注意,因为我是所有者,我也可以写入foo和bar,即使bar试图撤销我的读取权限。

因此,在您的情况下,您的rules声明列表read: true允许对整个仓库进行完全读取访问。将其更改为false,您将看到更好的结果。