我试图阻止黑客修改或查看Firebase数据库中的数据。我的数据库中的用户包含“身份验证”选项卡中所有用户的用户ID。我可以让数据库只让用户登录查看数据吗?
这是我的数据库结构:
firebase数据库结构
我想允许用户在“用户”中修改自己的用户ID条目,我想只允许管理员控制“订单”。我在Electron应用程序中使用Firebase,因此客户端连接到Node.js中的firebase
答案 0 :(得分:5)
您所描述的内容似乎有三个部分,但我们将它们结合起来也会影响您编写它们的方式。
我将首先分别讨论3件,然后再将它们组合起来。
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
通过将其置于规则的最高级别,您将阻止未通过其中一种受支持的Firebase身份验证方法登录的任何人进行读取或写入。
{
"rules": {
"users": {
"$uid": {
".write": "auth.uid === $uid"
}
}
}
}
这指定在用户路径下,对于每个用户id(使用$uid
语法将其指定为稍后要使用的变量),仅允许在当前经过身份验证的用户ID与该相同ID匹配时进行写入。
{
"rules": {
"orders": {
".read": "auth != null && auth.token.isAdmin",
".write": "auth != null && auth.token.isAdmin"
}
}
}
我们对orders
采用与users
条目类似的方法,但不是检查用户ID,而是简单地说只有管理员可以在{{1}下的任何位置进行读写操作}。
现在,如果这些规则以一种更具体的规则覆盖不太具体的规则(例如CSS选择器)的方式聚集在一起,那么我们可以简单地将上述所有规则合并在一起:
orders
但,Firebase数据库规则与此相反。在较浅的规则中提供访问权限将覆盖试图拒绝访问的任何更深层的规则(尽管可以在更深的规则中授予更多权限)。因此,上述实际上将为任何登录用户提供对整个数据库的完全读/写访问权。
鉴于此,我们在组合这些时需要更加小心,以确保我们的单独意图保持有效。最重要的是,第一部分仅按用户登录/写入将是需要修改的部分,因为它位于顶层。
幸运的是,我们的规则来自第2部分和第2部分。 3无论如何要照顾我们从第1部分得到的大部分内容。只有在数据库中只有{
"rules": {
".read": "auth != null",
".write": "auth != null",
"orders": {
".read": "auth != null && auth.token.isAdmin",
".write": "auth != null && auth.token.isAdmin"
},
"users": {
"$uid": {
".write": "auth.uid === $uid"
}
}
}
}
和orders
时才会出现这种情况。我们唯一缺少的是users
上的read
规则。由于您只指定用户只能编写自己的数据,所以我们还不完全清楚您想要读取用户数据的规则类型,因此我假设所有登录用户都可以读取用户数据。 / p>
然后合并成为:
users
请注意,如果您有数据库的其他节点,则需要复制{
"rules": {
"orders": {
".read": "auth != null && auth.token.isAdmin",
".write": "auth != null && auth.token.isAdmin"
},
"users": {
".read": "auth != null",
"$uid": {
".write": "auth.uid === $uid"
}
}
}
}
和/或auth != null
的{{1}}规则,因为此处您只展示{ {1}}和read
。
希望有所帮助!