通过父级筛选早于时间戳的消息来验证读取规则



我正在编写一个示例聊天应用程序,但安全读取规则有问题。我只希望用户在连接到聊天应用程序后可以阅读消息。为此,我在消息中添加了一个时间戳值。现在,我只希望如果这个时间戳>=用户可以获得此消息的实际时间戳。但这不起作用,因为我无法从父级访问$msgId(通过推送创建)。这是我的规则.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"
        }
      },
  }
}

您在"message"one_answers"$msgId"上犯了一个错误,因为您可能不想要"message"级别,而是直接想要$msgId(如果消息是直接聊天的子级)。因此,你应该把这些结合起来。

至于用户创建日期,则取决于您是将用户保存在Firebase还是其他地方。如果是Firebase,那么您可以使用root.child('users/'+auth.id+'/created_at')之类的东西进行比较。如果在其他地方,请使用auth令牌来传递用户注册日期。同时,Firebase提供了服务器端的时间戳进行比较。

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

最新更新