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))
)