【问题标题】:Allowing users to only modify their own data on firebase允许用户仅在 firebase 上修改自己的数据
【发布时间】:2018-01-26 02:25:27
【问题描述】:

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

这是我的数据库结构:

firebase 数据库结构

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

【问题讨论】:

    标签: node.js firebase firebase-realtime-database


    【解决方案1】:

    是的,这绝对可以使用Firebase Database Rules

    您所描述的内容似乎包含三个部分,但我们将它们组合起来也会影响您编写它们的方式。

    我将从分别回顾这 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,我们只是说只有管理员可以在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"
                }
            }
        }
    }
    

    然而,Firebase 数据库规则在某种程度上与此相反。在较浅的规则中提供访问将覆盖任何试图拒绝访问的较深的规则(尽管可以在较深的规则中授予更多权限)。因此,上述内容实际上会为任何登录用户提供对整个数据库的完全读/写访问权限。

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

    幸运的是,无论如何,我们在第 2 部分和第 3 部分中的规则处理了我们从第 1 部分中获得的大部分内容。仅当您的数据库中只有 orders 和 users 时才适用。我们唯一缺少的是users 上的read 规则。不完全清楚你想要什么样的规则来读取用户数据,因为你只指定一个用户只能写他或她自己的数据,所以我假设所有登录的用户都可以读取用户数据。

    然后合并变成:

    {
        "rules": {
            "orders": {
                ".read": "auth != null && auth.token.isAdmin",
                ".write": "auth != null && auth.token.isAdmin"
            },
            "users": {
                ".read": "auth != null",
                "$uid": {
                    ".write": "auth.uid === $uid"
                }
            }
        }
    }
    

    请注意,如果您有 read 和/或 write,则需要在数据库的其他节点中复制 auth != null 规则,因为这里您只炫耀 orders 和 users .

    希望有帮助!

    【讨论】:

    • “Firebase 数据库规则实际上与此相反。较浅的规则将覆盖任何较深的规则。”它比这稍微复杂一些。一旦您授予某个节点的权限,您就不能在较低级别取消该权限。所以:较低级别可以授予额外权限,但他们不能取消现有权限。
    • 你是对的。我的回答在您指出的引文中采取了“绝对交易”的立场。我已经编辑了我的答案以使其软化一点,并更清楚地了解您提出的内容。谢谢!
    • 谢谢你们。我会调查这个
    • 你打错了吗? " auth.uid != $uid " 应该是 === 而不是 !=
    • 如果我将 Putting It All Together 部分粘贴到 Simulation failed - 第 4 行:&& 的右操作数必须是布尔值。第 5 行:&& 的右操作数必须是布尔值。
    猜你喜欢
    • 2020-10-18
    • 1970-01-01
    • 2019-09-24
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多