Firebase Firestore规则问题:如何允许读取未标记isRemoved=true的文档
修正Firebase Firestore读取规则:仅允许读取未标记为移除的文档
你的规则之所以阻止了所有读取,主要是两个逻辑错误导致的,我来帮你拆解并修正:
原规则的问题点
- 字段存在性判断错误:Firestore规则中不能直接用
resource.data.isRemoved.exists来判断字段是否存在——如果字段不存在,resource.data.isRemoved会直接抛出错误,导致整个条件为假。正确的做法是用'isRemoved' in resource.data来检查字段是否存在于文档中。 - 布尔值比较错误:你定义的
isRemoved是布尔类型,但原规则中却和字符串'true'做比较。布尔值true和字符串'true'永远不相等,这会导致即使isRemoved是false,这部分条件也会出现逻辑偏差。
正确的规则写法
match /Users/{User_Id}/Sessions/{Sessions_Id} { allow read, write: if request.auth != null && request.auth.uid == User_Id && (!('isRemoved' in resource.data) || resource.data.isRemoved != true); }
规则逻辑说明
- 基础权限校验:确保请求是已认证用户,且用户ID和文档路径中的
User_Id一致,这部分和你原规则的逻辑一致。 - 读取过滤条件:
- 如果文档中没有
isRemoved字段,则允许读取; - 如果文档中有
isRemoved字段,只有当它的值不是true(即false)时,才允许读取。
- 如果文档中没有
可选优化:分离读写权限
如果你的写入操作不需要限制isRemoved字段(比如允许用户标记文档为移除),可以把读写权限分开定义,让规则更清晰:
match /Users/{User_Id}/Sessions/{Sessions_Id} { // 写入权限:仅允许所有者操作 allow write: if request.auth != null && request.auth.uid == User_Id; // 读取权限:仅允许所有者读取未被标记移除的文档 allow read: if request.auth != null && request.auth.uid == User_Id && (!('isRemoved' in resource.data) || resource.data.isRemoved != true); }
内容的提问来源于stack exchange,提问作者Michael Vish
相关产品推荐
相关产品推荐

