【问题标题】:Firebase Rule to read data on nested nodes for last 10 minutesFirebase 规则在过去 10 分钟内读取嵌套节点上的数据
【发布时间】:2018-10-20 08:49:31
【问题描述】:

我想实施一个规则来读取最后 5 或 10 分钟的数据。我的数据库是这样的:

我想允许用户阅读过去 10 分钟的消息,但该规则不起作用,我无法使其起作用我尝试了不同的规则,例如这样。

"Messages": {
            "$messagekey": {
                "$key": {
                   ".read":"root.child('Users/Messages/'+$messagekey+'/'+$key+'/messageTime').val()> (now - 600000000)",                    }
                },
             ".write":"auth!=null"
            }

还有这个

"Messages": {
        "$messagekey": {
            "$key": {
                ".read": "data.child('messageTime').val() > (now - 600000)"
                    }
                },
                ".write": "auth!=null"
            }

请提供任何帮助或建议。 错误信息

编辑 2 使用这条规则我仍然无法使其工作

{
        "rules": {
        "Messages": {
                    "$messagekey": {
                        "$key": {
                            ".read": "data.child('messageTime').val() > (now - 90000000)"
                        }
                    },
                    ".write": "auth!=null"
                }
      }
    }

这是我的数据

 Users
        Messages
            WZTDdZslJrMFqgDLNWo4jXehsF02_nUVrJthSqHXH8Ur0stRz2tihxdg1
                -LPFPTBx7BA6urp-CSbZ
                        messageText: "Hello"
                        messageTime: 1540059028779
                        messageUser: "Joker's Grin"
                        messageUserId: "WZTDdZslJrMFqgDLNWo4jXehsF02"
                -LPFPUB5efDAIVu_AxP0
                        messageText: "how are you"
                        messageTime: 1540059028779
                        messageUser: "Crazy Eights"
                        messageUserId:"nUVrJthSqHXH8Ur0stRz2tihxdg1"

我使用两个通配符“messagekey”和“key”来访问messageId。也尝试了这些规则,除了 read: true。

    ".read": "data.child('messageTime').val() >0"
    ".read": "data.child('messageTime').val() !==null"
    ".read": "data.exists()"
    ".read": "data.hasChild('MessageId')"

这里是截图

【问题讨论】:

  • 第二个 sn-p 乍一看还不错。你对它运行了什么读取操作,你得到了什么错误?
  • @FrankvanPuffelen 这是第二个 sn-p 模拟结果的错误消息类型读取位置用户/消息/abc123xyz/xyzabc123 数据 null Auth null 读取拒绝第 22 行(/Users/Messages/abc123xyz/xyzabc123)阅读:“data.child('messageTime').val() > (现在 - 600000)”
  • 我无法重现该问题。我在下面发布了一个答案以显示我做了什么。在您发布的屏幕截图中(请始终将文本内容作为实际文本发布),看起来您的 messageTime 比我使用的值短一位。
  • @FrankvanPuffelen 仍然无法使用两级通配符使其工作。唯一有效的规则是 read:true。请检查编辑。
  • 对我来说,它同样适用于嵌套的孩子。请参阅更新的屏幕截图。不幸的是,我看不出你的有什么不同。

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


【解决方案1】:

我刚刚将此值添加到我自己的数据库中:

"52903949": {
  "messageTime": 1540054472392
}

其中52903949 是您的问题的ID,1540054472392 是我添加时Date.now() 返回的值。

然后我添加了这些规则:

{
  "rules": {
    "52903949": {
      ".read": "data.child('messageTime').val() > (now - 600000)"
    }
  }
}

并且能够通过以下结果访问模拟器中的数据:

如果我将600000 缩短,读取将失败,因为该时间已经过期。


更新了嵌套子级的屏幕截图

【讨论】:

    猜你喜欢
    • 2019-03-12
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    相关资源
    最近更新 更多