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
相关产品推荐
相关产品推荐

