【问题标题】:Multiple inhertitance Firebase security rules多重继承 Firebase 安全规则
【发布时间】:2017-05-11 21:54:34
【问题描述】:

我对自己的理智有疑问。以下是我的一部分 Firebase 规则

{
  "rules": {
      ".read": "auth != null",
      ".write" : false,
      "users": {
           "$uid": {
               ".read": "auth != null && auth.uid == $uid", 
               ".write": "auth != null && auth.uid == $uid",
               "tokens": {
                   ".write": "(newData.val() < data.val())"
               }
           }
      },
      ...

如果我理解正确,规则规定:

  • 所有用户都必须经过身份验证才能读取任何节点
  • 所有用户都不能写入任何节点
  • 特定于用户节点:
  • 为了从你自己的数据中读取,你需要被授权并且你只能读取你自己的节点
  • 要写入您自己的用户数据,您必须经过身份验证并且只能写入您自己的节点
  • 用户/令牌节点只能被任何用户递减,不能被任何用户递增

有人可以通过阅读 Firebase 安全规则文档来确认我的假设/理解吗?

还有没有人有任何关于使用模拟器的好文章或有用的提示!?

【问题讨论】:

    标签: firebase firebase-security


    【解决方案1】:

    安全规则的一个重要概念是读/写规则沿树“级联”。这在the documentation 中进行了简要讨论。这意味着,当您从上到下阅读规则时,授予访问权限的第一条规则优先于该位置的子项在其下方指定的任何规则。

    解决您的每个项目:

    • 所有用户都必须经过身份验证才能读取任何节点(
    • 所有用户都不能写入任何节点(未经身份验证的用户不能写入任何节点
    • 特定于用户节点:
    • 为了从你自己的数据中读取,你需要被授权并且你只能读取你自己的节点(YES
    • 要写入您自己的用户数据,您必须经过身份验证并且只能写入您自己的节点(
    • 用户/令牌节点只能被任何用户递减而不能被任何用户增加(见下文

    在您当前的规则中,对较小令牌的检查无效,因为之前授予经过身份验证的用户写入权限的规则会覆盖它。您还需要解决没有现有令牌值的情况。我的修复建议是使用.validate 规则。 documentation推荐:

    在 .write 规则授予访问权限后使用,以确保数据 正在编写符合特定架构。

    {
      "rules": {
        ".read": "auth != null",
        ".write": false,
        "users": {
          "$uid": {
            ".read": "auth.uid == $uid",
            ".write": "auth.uid == $uid",
            "tokens": {
              ".validate": "!data.exists() || (newData.val() < data.val())"
            }
          }
        }
      }
    }
    

    至于模拟器,我不知道任何用户指南,但已经设法通过实验学习了如何使用它。这是理解规则的非常有效的工具。

    以下是使用模拟器的几个案例:

    当你打开模拟器时,Authenticated 是关闭的,它模拟了一个未经验证的用户。要模拟读取,请单击读取按钮,输入位置:例如/users/xyz/tokens,然后单击运行。您将在禁止该操作的规则行上看到一个红色 X。要模拟经过身份验证的读取,请单击 Authenticated 按钮,为方便起见,输入一个简单的用户 UID,例如“Frank”。现在输入位置/users/Frank/tokens,点击运行,观察读取成功。

    您可以对写入、输入位置、身份验证设置和值进行类似的测试。

    【讨论】:

    • 我不确定你是否正确,在模拟器中我能够成功写入,即使我在根目录下有 "write" : "false"。在模拟器中试一试。但是你是正确的,它不能以相反的方式工作 >
    • 但我提出这个问题的主要原因是要找出如何执行令牌规则,只允许用户减少值而不增加它!?你对此有什么想法吗!?
    • @Learn2Code:我正在使用您的规则,无法编写。您指定的位置是什么?
    • 位置:用户/ |数据(杰森):“令牌”:“50”|提供者,不要放入token的验证部分
    • 刚刚看到您的编辑。您是否在实际数据库上尝试过该操作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 2021-05-16
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多