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

Firestore集合组子路径安全规则:提取路径中的businessId

问题(翻译后)

我有如下Firestore集合组查询:collectionGroup('test').where('businessId', '==', '123').get(),需为其配置安全规则。已知需使用通配符匹配集合组:

match /{path=**}/test/{testId}

我的集合结构为:

/businesses/123/test
/businesses/111/test

需要从路径中提取businessId,以调用以下函数:

function canI(businessId) {
  return get(/databases/$(database)/documents/businesses/$(businessId)/users/$(request.auth.uid)).data.doIHaveAccess;
}

请问在如下规则中应如何填写获取businessId的部分:

match /{path=**}/test/{testId} {
   allow read: if canI(<get businessId somehow>)
}

解决方案

方案一:精准路径匹配(推荐)

既然你的test集合固定为businesses/{businessId}的直接子级,直接修改匹配规则捕获businessId通配符即可,无需额外路径处理,逻辑更清晰可靠:

match /businesses/{businessId}/test/{testId} {
  allow read: if canI(businessId);
}

方案二:从path=**中提取businessId

如果必须保留/{path=**}/test/{testId}的模糊匹配(比如test集合可能出现在多个路径层级),可以通过Firestore规则的split()方法拆分路径片段,提取目标businessId:

match /{path=**}/test/{testId} {
  // path变量对应"businesses/123"这类前缀,拆分后最后一个元素就是businessId
  allow read: if canI(split(path, '/')[-1]);
}

额外安全验证(可选)

为了防止恶意构造查询获取不属于目标businessId的文档,可以同时验证文档的businessId字段与路径提取的businessId一致:

match /businesses/{businessId}/test/{testId} {
  allow read: if canI(businessId) && resource.data.businessId == businessId;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:18:22