【问题标题】:Firebase Database rules - wildcard for dynamic keyFirebase 数据库规则 - 动态键的通配符
【发布时间】:2020-05-31 19:52:59
【问题描述】:

我有这个用例,我想授予其他用户读取我的 ID 密钥下数据的权限,前提是他们的 ID 有一个密钥 ===。

假设我有用户 123 和 456,他们在“

下编写 json 对象
orders-
              I
               -123
                        I
                         -456

我只希望用户 123 和 456 能够读取 456 个节点。根据我提供的规则,只有 123 能够读取节点:

"orders": {
    "$uid": {
        ".read": "auth.uid  === $uid || root.child('orders').child($uid).child(auth.uid).exists()",
        ".write": "auth.uid != null",
    }
}

我在这里做错了什么?有人可以帮我解决这个问题吗?

编辑:模拟器的两张截图

【问题讨论】:

  • 请记住,我们无法知道您的屏幕截图中的数据是什么意思。并且......正在使中间段落不必要地难以阅读。您可能想用实际的 JSON 替换屏幕截图,您可以通过单击 Firebase Database console 上溢出菜单 (⠇) 中的“导出 JSON”链接来获取。查看您想要允许的最小读取代码也非常有用,但这会失败;尽可能多地硬编码值。
  • 感谢您的评论,您对 .... 的看法是正确的,并替换了它,现在我认为它更具可读性。我在规则模拟器中尝试这个,因为我没有实现它,直到我让规则按照我想要的方式工作。案例是用户在“orders”myID 下下订单并等待我将在同一个节点中发布的答案。我希望 myID 只能由我读取,然后如果有一个具有此用户 ID 的孩子,该用户能够读取这个孩子,但只有这个...问题是我不知道如何设置此规则我认为我提供的代码应该可以工作,但它不允许用户阅读此节点。
  • 如果问题仅存在于模拟器中,请编辑您的问题以包含模拟器的屏幕截图,其中包含您尝试读取的路径以及您正在使用的身份验证状态。
  • 好的,我已经添加了两张截图。
  • 当您使用模拟器时,它会使用您数据库中的实际数据来确定是否允许读取或写入。您输入到模拟器的路径看起来与您数据库中的路径不匹配。

标签: firebase firebase-realtime-database firebase-authentication firebase-security


【解决方案1】:

我通过设置这些规则解决了它(注意 $id 嵌套在 $uid 中):

{
  "rules": {
          "orders": {
          "$uid": {
            ".read": "auth.uid  === $uid",
        ".write": "auth.uid === $uid",
          "$id": {
            ".read": "auth.uid  === $id",
            ".write": "auth.uid === $id"
          },
          }
        }
  }
}

以前我认为这条线应该可以完成工作:

 ".read": "auth.uid  === $uid || root.child('orders').child($uid).child(auth.uid).exists()",

【讨论】:

    猜你喜欢
    • 2017-04-30
    • 2021-01-24
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多