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

Firebase Firestore安全规则引入resource后无法匹配问题

Firestore安全规则含resource关键字时无法命中的问题

编写Firebase Firestore安全规则时,期望实现文档visibility字段为public时允许读取的校验逻辑,但发现只要规则中包含resource关键字,规则就无法被命中匹配,规则逻辑完全不执行。

以下规则均无法匹配生效:

match /publicProfiles/{userId} {
    allow read: if resource.data.visibility !=null ;
} 
match /publicProfiles/{userId} {
    allow read: if resource.data.visibility == "public";
}

上述规则写法参考Firebase官方文档示例,但在规则Playground、实际接口请求场景下测试均无法生效。

认证相关逻辑测试结果

测试场景为未携带认证信息的请求:

  • 可命中匹配并返回权限拒绝的规则:
match /publicProfiles/{userId} {
    allow read: if request.auth != null && request.auth.uid == userId ;
}
  • 无法命中匹配的规则:
match /publicProfiles/{userId} {
    allow read: if request.auth.uid == userId ;
}

已分别测试目标文档存在、不存在两种场景,只要规则包含resource关键字均无法匹配。


补充配置与复现信息

  • 客户端请求实现:使用react-native-firebase发起单文档get请求(非集合查询),请求代码如下:
let doc = await firebase.firestore().collection('publicProfiles').doc(userId).get()
  • 顶层通用规则配置:规则集最上方配置了一条全量通用规则,默认除users集合外其余集合允许公开读取,代码如下:
match /{collectionName}/{docId} {
      allow read, get: if collectionName != 'users';
    }
  • 实际复现表现:
    测试读取的publicProfiles目录下目标文档的visibility字段值为private,按逻辑包含resource判断的规则应当命中并返回权限拒绝,但实际规则未被匹配。在规则Playground中测试get文档请求也复现了相同问题:
    • 未认证用户发起请求时,带request.auth != null &&前缀的规则可被读取,逻辑在&&运算符前短路返回拒绝
    • 已认证用户发起请求时,包含resource判断的规则未被匹配、逻辑未执行,请求直接放行
      实际客户端发起get请求的表现与Playground测试结果完全一致。

内容的提问来源于stack exchange,提问作者0hio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:09:17