允许用户仅在firebase上修改自己的数据

Mr.*_*ain 1 node.js firebase firebase-realtime-database

我试图阻止黑客修改或查看我的Firebase数据库上的数据.我的数据库中的用户包含"身份验证"选项卡中所有用户的用户ID.我可以让数据库只让用户登录查看数据吗?

这是我的数据库结构:

firebase数据库结构

在此输入图像描述

我想允许用户修改他们自己的用户ID在"用户"中的条目,我想只允许管理员控制"订单".我在Electron应用程序中使用Firebase,因此客户端连接到Node.js中的firebase

cas*_*ber 6

是的,使用Firebase数据库规则绝对可行

您所描述的内容似乎有三个部分,但它们结合在一起也会影响您编写它们的方式.

我将首先分别讨论3件,然后再将它们组合起来.

仅按登录用户读/写

{
    "rules": {
        ".read": "auth != null",
        ".write": "auth != null"
    }
}
Run Code Online (Sandbox Code Playgroud)

通过将其置于规则的最高级别,您将阻止未通过支持的Firebase身份验证方法之一登录的任何人进行任何读取或写入操作.

用户修改用户输入

{
    "rules": {
        "users": {
            "$uid": {
                ".write": "auth.uid === $uid"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这指定在用户路径下,对于每个用户id(使用$uid语法将其指定为稍后要使用的变量),仅允许在当前经过身份验证的用户ID与该相同ID匹配时进行写入.

管理员控制订单

{
    "rules": {
        "orders": {
            ".read": "auth != null && auth.token.isAdmin",
            ".write": "auth != null && auth.token.isAdmin"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我们ordersusers条目采取了类似的方法,但是我们只是说管理员可以在任何地方进行读写,而不是检查用户ID orders.

把它放在一起

现在,如果这些规则以一种更具体的规则覆盖不太具体的规则(例如CSS选择器)的方式聚集在一起,那么我们可以简单地将所有上述内容合并在一起,如下所示:

{
    "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"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,Firebase数据库规则与此相反.提供在较浅的访问规则将覆盖任何更深层次的规则试图拒绝访问(尽管有可能在更深的规则授予更多的权限).因此,上述实际上将由任何登录用户提供对整个DB的完全读/写访问权限.

鉴于此,我们在组合这些时需要更加小心,以确保我们的单独意图保持有效.最重要的是,第一部分" 仅登录用户读取/写入 "部分将是需要修改的部分,因为它位于顶层.

幸运的是,我们从第2部分和第3部分开始的规则处理了我们从第1部分得到的大部分内容.只有在您的数据库中存在orders和存在时,这才适用users.我们唯一缺少的是read规则users.目前还不完全清楚读取用户数据需要哪种规则,因为您只指定用户只能编写自己的数据,因此我假设所有登录用户都可以读取用户数据.

然后合并成为:

{
    "rules": {
        "orders": {
            ".read": "auth != null && auth.token.isAdmin",
            ".write": "auth != null && auth.token.isAdmin"
        },
        "users": {
            ".read": "auth != null",
            "$uid": {
                ".write": "auth.uid === $uid"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果你有数据库,你需要复制数据库的auth != null规则read和/或write其他节点,因为在这里你只展示ordersusers.

希望有所帮助!

  • “Firebase 数据库规则实际上与此相反。较浅的规则将覆盖任何较深的规则。” 它比那稍微复杂一些。一旦您向某个节点授予了权限,您就无法在较低级别取消该权限。因此:较低级别*可以*授予额外的权限,但他们*不能*取消现有的权限。 (2认同)