【问题标题】:limiting array size in security rules cloud firestore using request.resorce.data?使用 request.resorce.data 限制安全规则云 Firestore 中的数组大小?
【发布时间】:2022-08-16 19:59:09
【问题描述】:

我有以下两个安全规则,稍后检查 DB 中的文档 premiumUitill 值是否大于当前时间,这意味着溢价是有效的。

这里的问题是我要禁用数组大小​​的第一条规则,因此它不会超过 50 的长度,并且我正在使用 arrayUninon(data) 推送我应该检查 resource.data 而不是 request.resorce.data 的大小吗?在我的测试中,request.resource.data.arr.size() < 50 有效,但检查传入数据没有意义,因为传入的数据只有有效负载,arrayUnion() 才能使它工作?

await updateDoc(docRef, {
      arr: arrayUnion(payload),
    }).catch((error) => {
      errorHandeling(error, \'An error has happened\', reduxDispatch, SetSnackBarMsg);
    });

&& request.resource.data.arr.size() < 50
&& resource.data.premiumUntill > request.time

    标签: google-cloud-platform google-cloud-firestore


    【解决方案1】:

    在 Cloud Firestore 安全规则中,resource 是指数据库中的现有文档,request.resource 是指请求中存在的文档(在写入期间,即设置或更新)。

    来自data validation 的文档:

    resource 变量引用请求的文档,resource.data 是存储在文档中的所有字段和值的映射。有关资源变量的更多信息,请参阅reference documentation

    写入数据时,您可能希望将传入数据与现有数据进行比较。在这种情况下,如果您的规则集允许挂起写入,则 request.resource 变量包含文档的未来状态。对于只修改文档字段子集的更新操作,request.resource 变量将包含操作后的待处理文档状态。您可以检查 request.resource 中的字段值以防止不需要或不一致的数据更新:

    service cloud.firestore {
      match /databases/{database}/documents {
        // Make sure all cities have a positive population and
        // the name is not changed
        match /cities/{city} {
          allow update: if request.resource.data.population > 0
                        && request.resource.data.name == resource.data.name;
        }
      }
    }
    

    另外你可以看这个video,也可以看看这个stackoverflow

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 2021-01-19
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多