当我运行下面的查询时,我得到permission-denied
,在“监视器规则”选项卡中,我得到一个错误。
const timeNow = useMemo(() => Timestamp.now(), []);
const query = query(
postRef,
where("tags", "array-contains-any", ["Event"]),
where("publishDate", "<=", timeNow),
orderBy("publishDate", "desc"),
limit(4)
);
这是我的安全规则的一部分,我已经找到了错误来自:
service cloud.firestore {
match /databases/{database}/documents {
match /posts/{postID}{
allow read: if resource.data.publishDate <= request.time;
}
}
}
我已测试将规则更改为resource.data.publishDate != null
,结果为真,例如允许请求。当我尝试resource.data.publishDate is timestamp
时,得到拒绝。
所以我想知道我在查询中有什么错误,或者我在安全规则中遗漏了什么?
2条答案
按热度按时间vsnjm48y1#
request.time
不能作为安全规则中的范围检查。此外,Timestamp.now()
令牌只在更新文档中的字段时有效-它也不能有效地用于范围过滤器。所编写的规则仅在获取单个文档时有效。在这种情况下,规则将检查单个文档字段以查看日期是否小于或等于当前时间。
我不认为有任何直接的解决方法,你可以编写后端代码来强制过滤器必须始终限制查询过滤器中的日期,并让你的应用调用后端来获取数据。
dauxcl2d2#
您的安全规则语法看起来是正确的。下面是我使用模拟验证的方法。
我认为文档的publishDate字段实际上不是时间戳,而是存储了一些其他类型的值,如字符串。我确认了安全规则在我们尝试将request.time与时间戳以外的值进行比较时会给出错误消息。
因此,我建议您将规则更新为:
if resource.data.publishDate is timestamp && resource.data.publishDate <= request.time;