通过父级验证读取规则 - 过滤早于时间戳的消息

时间:2013-08-09 09:26:05

标签: firebase firebase-security

我正在编写示例聊天应用程序,但我遇到了安全性读取规则的问题。我只希望用户在连接聊天应用程序后能够阅读消息。为此,我在消息中添加了一个时间戳值。现在我只想要这个时间戳> =用户可以获得此消息的实际时间戳。但这不起作用,因为我无法从父级访问$ msgId(由push创建)。这是我的rules.json:

{
  "rules": {
    ".read": false,
    ".write": false,
    "chat": {
      ".write": false,
      ".read": false,

      "message": {
        ".write": false,
        ".read": "data.child($msgId).child('timestamp').val()  == now",

        "$msgId": {
          ".write": true,
          ".validate": "newData.hasChildren(['name','text','timestamp']) && newData.child('timestamp').val() == now"
        }

      },
  }
}

1 个答案:

答案 0 :(得分:1)

您在使用“message”和“$ msgId”时出错,因为您可能不想要“消息”级别,而只是直接使用$ msgId(如果消息直接是聊天子项)。因此,你应该把它们结合起来。

然后,对于用户创建日期,这取决于您是将用户保存在Firebase还是其他位置。如果是Firebase,那么您可以使用root.child('users /'+ auth.id +'/ created_at')之类的内容进行比较。如果在其他地方,请使用身份验证令牌传递用户注册日期。与此同时,Firebase为比较提供了服务器端时间戳。

    "$msgId": {
      ".read": "data.child('timestamp').val() >= auth.created_date",
      ".write": true,
      ".validate": "newData.hasChildren(['name','text','timestamp']) && newData.child('timestamp').val() == now"
    }