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

Firestore规则下无法访问Temp文档的TopUp子集合问题咨询

Firestore父集合与子集合独立规则的场景是否支持?

我尝试在Firestore的Temp集合文档下的TopUp子集合中写入数据,Temp集合文档拥有独立的写入规则,与TopUp子集合的规则不同,想确认该场景是否被支持?

规则代码

// 通配符{deviceId}让deviceId变量可在规则中使用。
// 存储客户端临时数据,用于通过Firebase规则校验序列号。
match /Temp/{deviceId} {

  // 需要身份验证。
  allow create, update: if request.auth != null && 
  // 设备只能修改自己的数据。
  request.auth.uid == deviceId;
  
  // 客户端(移动端和网页端)不允许读取或删除数据。
  allow read, delete: if false;

}

// 通配符{userId}让userId变量可在规则中使用。
// 存储客户端临时数据,用于通过云函数校验充值操作。
match /Temp/{userId}/TopUp/{docId} {

  // 需要身份验证。
  allow create: if request.auth != null && 
  // 收银员只能为分配给自己的设备充值。
  // 确保请求用户(收银员)的uid与设备的cashier_id匹配。
  request.auth.uid == get(/databases/$(database)/documents/Devices/$(userId)).cashier_id;
  
  // 客户端(移动端和网页端)不允许读取、更新或删除数据。
  allow read, update, delete: if false;

}

示例代码

firestore.collection("Temp")
            .doc($('input:hidden[name=zyx]').val())
            .collection("TopUp")
            .doc()
            .set({
                cash: $("#cashField").val(),
                topUp: $("#topUpField").val()
            },{ merge: true }).then((doc) => {
                $('#cashField').val("")
                $('#topUpField').val("")
                Swal.fire({
                    title: "Success!",
                    text: "Top up should reflect now on the device.",
                    type: "success"
                }).then(function () {
                    hideDevicesLoading()
                    $("#deviceTopUpModalDetail #closeModule").click()
                    fetchData("deviceList", DEVICES)
                });
            }).catch((error) => {
                showError(error.message)
                hideDevicesLoading()
            });

该场景完全被Firestore支持。Firestore的安全规则允许为父集合和子集合分别定义独立规则,子集合规则不会继承父集合规则,二者各自生效。

具体到你的实现:

  • 写入Temp/{deviceId}文档时,会触发第一个规则块校验,仅设备自身(uid与deviceId匹配)且已认证的用户可创建或更新该文档。
  • 写入Temp/{userId}/TopUp/{docId}子集合文档时,会触发第二个规则块校验,仅已认证且uid与对应Devices/{userId}文档中cashier_id匹配的收银员可创建该子集合文档。

父集合规则不会影响子集合的操作权限,你的规则写法符合Firestore规则设计逻辑,只要写入操作满足子集合的规则条件即可成功执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:40:33