You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

规则逻辑说明

  1. 基础权限校验:确保请求是已认证用户,且用户ID和文档路径中的User_Id一致,这部分和你原规则的逻辑一致。
  2. 读取过滤条件:
    • 如果文档中没有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:28:32