Javascript Firebase实时数据库安全,仅使用时间戳读取最近10分钟的消息不起作用

Javascript Firebase实时数据库安全,仅使用时间戳读取最近10分钟的消息不起作用,javascript,firebase,firebase-realtime-database,firebase-security,Javascript,Firebase,Firebase Realtime Database,Firebase Security,我已经看到了一些关于实现这一点的帖子和文档,但我无法让它发挥作用 我正在使用firebase.database.ServerValue.timestamp为每条聊天信息保存一个时间戳 如果我添加在中找到的安全规则(粘贴在下面),它将不会返回任何消息。每当我删除检查时间戳的代码段时,所有消息都会按预期返回 .read:“data.child('timestamp').val()>(现在为-600000)”, 这是我所有文档的安全规则(请参阅。阅读聊天/下的,了解我想了解的特定规则) 有人能看出我错

我已经看到了一些关于实现这一点的帖子和文档,但我无法让它发挥作用

我正在使用
firebase.database.ServerValue.timestamp
为每条聊天信息保存一个时间戳

如果我添加在中找到的安全规则(粘贴在下面),它将不会返回任何消息。每当我删除检查时间戳的代码段时,所有消息都会按预期返回

.read:“data.child('timestamp').val()>(现在为-600000)”,

这是我所有文档的安全规则(请参阅
。阅读
聊天/
下的
,了解我想了解的特定规则)

有人能看出我错在哪里吗

谢谢大家!

来自:

规则不是过滤器

规则是以原子的方式应用的。这意味着,如果该位置或父位置没有授予访问权限的规则,则读或写操作将立即失败。即使每个受影响的子路径都是可访问的,在父位置的读取也将完全失败

这里的示例表明,如果您进行一个可能返回受限数据的查询,那么即使允许所有实际存在的数据,整个查询也会失败

虽然实时数据库和Firestore是不同的产品,但它们在这方面的行为是相同的,我认为Firestore文档在这一概念上更加清晰,因此我将在Firestore文档的段落中留下

云Firestore安全规则根据其潜在结果评估每个查询,如果可能返回客户端无权读取的文档,则请求将失败。查询必须遵循安全规则设置的约束

确保您的查询只要求允许的记录。请求超出范围的记录将使整个请求失败,因此,当规则就位时,您将不会收到任何消息。

来自:

规则不是过滤器

规则是以原子的方式应用的。这意味着,如果该位置或父位置没有授予访问权限的规则,则读或写操作将立即失败。即使每个受影响的子路径都是可访问的,在父位置的读取也将完全失败

这里的示例表明,如果您进行一个可能返回受限数据的查询,那么即使允许所有实际存在的数据,整个查询也会失败

虽然实时数据库和Firestore是不同的产品,但它们在这方面的行为是相同的,我认为Firestore文档在这一概念上更加清晰,因此我将在Firestore文档的段落中留下

云Firestore安全规则根据其潜在结果评估每个查询,如果可能返回客户端无权读取的文档,则请求将失败。查询必须遵循安全规则设置的约束


确保您的查询只要求允许的记录。请求超出范围的记录将使整个请求失败,因此,当规则生效时,您不会收到任何消息。

对于堆栈溢出,请不要使用代码和文本的图片。最好是将文本直接复制到问题中,并将其格式化,以便于阅读。编辑器有方法指示哪些文本是代码或引号。在堆栈溢出时,请不要使用代码和文本的图片。最好是将文本直接复制到问题中,并将其格式化,以便于阅读。编辑器有方法指示哪些文本是代码或引号。谢谢,但这是来自
Cloud Firestore
文档,而不是
实时数据库
文档。您确定这适用于实时数据库吗?请参阅以查看实时数据库文档。我很抱歉。是从实时数据库文档中声明相同内容的部分。我将更新我的答案以匹配。谢谢Elan!我更新了我的答案,以显示我是如何查询数据的。请查看我链接到编辑的答案下的部分。谢谢,但这是来自
Cloud Firestore
文档,而不是
实时数据库
文档。您确定这适用于实时数据库吗?请参阅以查看实时数据库文档。我很抱歉。是从实时数据库文档中声明相同内容的部分。我将更新我的答案以匹配。谢谢Elan!我更新了我的答案,以显示我是如何查询数据的。请检查我链接的部分,以获取编辑的答案
  "rules": {
    "online": {
      "$uid": {
        ".read": "auth != null && auth.token.email_verified == true",
        ".write": "$uid === auth.uid && auth.token.email_verified == true"
      }
    },
    "chat": {
      ".indexOn": ["timestamp"],
      // signed in and message was sent in last 10 min
      ".read": "auth != null && auth.token.email_verified == true && data.child('timestamp').val() > (now - 600000)",
      // signed in, your user id, and authed thru ig
      ".write": "auth != null && auth.token.email_verified == true && root.child('users').child(auth.uid).child('iga').val() == true",
      "$uid": {
        ".validate": "newData.hasChildren(['username', 'timestamp', 'text', 'user_id'])",
        "timestamp": { 
          ".validate": "newData.val() <= now"
        },
        "text": { 
          ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length <= 280"
        },
        "user_id": {
          ".validate": "newData.val() === auth.uid"
        }
      }
    },
    "users": {
        "$uid": {
        // only read your user
        ".read": "$uid === auth.uid && auth.token.email_verified == true",
        // only admin can write
        ".write": "false",
        ".validate": "newData.hasChildren(['iga'])",
      }
    },
    "video_src": {
      ".read": "auth != null",
      ".write": "auth.uid === 'Fcbp0p6Gd3Q5baljAV0rGWBqSR22'"
    },
    "captions": {
      ".read": "auth != null",
      ".write": "auth.uid === '2HgVzfosZqgK0LINUeYWKF1Bxyi2'",
      "$uid":{
        ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length <= 140"
      }
    }
  }
}
   const timestamp = new Date().getTime()
   return this.chatRef
      .orderByChild('timestamp')
      .startAt(timestamp)
      .on('child_added', 
        snapshot => callback(this.parseMessage(snapshot))
      )