Firestore中基于lastUpdate的更新限流规则不生效问题求助
Firestore中基于lastUpdate的更新限流规则不生效问题求助
嘿,我帮你排查下问题所在,你遇到的权限拒绝大概率是因为规则函数里的几个细节问题:
首先看你写的notThrottled函数,你目标是让用户每8小时更新一次,但函数里写的是duration.value(1, "m")——这里的"m"代表分钟,你写成1分钟限流了!这明显是笔误,应该改成duration.value(8, "h")("h"是小时单位)。
但就算改了这个,还有个隐藏问题:如果你的文档已经存在,但还没有lastUpdate字段(比如刚创建还没更新过),resource.data.lastUpdate会是未定义的,做时间加法运算会直接导致规则评估失败,返回false,触发权限拒绝。所以得给函数加个判断,允许没有lastUpdate字段的情况:
function notThrottled() { return resource == null || !resource.data.lastUpdate // 文档存在但无lastUpdate字段时允许更新 || request.time >= resource.data.lastUpdate + duration.value(8, "h"); }
另外,你的规则写法也有小问题:write权限其实已经包含了create和update,你现在分开写allow read, create;和allow update, write: if notThrottled();会造成权限重叠冲突,建议调整成更清晰的写法:
match /security/{userId} { allow read; allow create: if true; // 单独允许创建文档 allow update: if notThrottled(); // 更新受限流规则控制 }
最后别忘了一个关键步骤:你在客户端更新文档的时候,必须同时把lastUpdate字段设置为服务器时间,比如用Firebase的serverTimestamp():
// 客户端更新代码示例 db.collection("security").doc(userId).update({ // 你的其他更新字段 lastUpdate: firebase.firestore.FieldValue.serverTimestamp() });
如果不更新lastUpdate,下次请求的时候规则会一直用旧的时间判断,自然会一直被限流。
备注:内容来源于stack exchange,提问作者Luca Laure
相关产品推荐
相关产品推荐

