首页 > 解决方案 > updateData FieldValue.arrayUnion([value]) 的 Firebase Cloud Firestore 安全规则 [swift]

问题描述

我在 Cloud Firestore 中有一个文档。

“事件”字段的结构如下:

{
"events" : [ 
    "eventID-1": [
        "value1",
        "value2"    
        ],
    "eventID-2": [
        "value2",
        "value3"    
        ],
    "eventID-3": [
        "value3",
        "value4"    
        ]
    ]
}

在此处输入图像描述

更新[迅速]:

self.db.collection("collection").document(document).updateData([
  "events.eventID-1": FieldValue.arrayUnion([value2])
...

如何制定 Firebase Cloud Firestore 安全规则:

  1. 价值是独一无二的。即在写入时,检查数组eventID-1、eventID-2、eventID-3 ...中是否不存在该值。

  2. 检查(长度)记录的值

我刚刚弄清楚如何检查传入的数据,它是一张地图,我们只能得到一个值。

match /databases/{database}/documents {
    match /collection/{documentID} {
      allow write: if request.resource.data is map
                   && request.writeFields.size() == 1
    }
}

UPD:已处理:

  1. 检查查询中的字符串长度
allow write : if request.resource.data.events.values()[0].size() < 100
  1. 检查列表中的唯一性
allow write : if (request.resource.data.events.keys()[0] in resource.data.events.keys()) == false

但是我还没有想出如何解决我的问题((((帮助!!!

标签: swiftfirebasegoogle-cloud-firestorefirebase-security

解决方案


这是一个尝试:

allow write: if request.writeFields.size() == 1
    && geteventarray_after().size() == geteventarray_before().size() + 1 // Making sure that the size increased so that is is unique
    && getnewelement().size() < 100     // Making sure the new element size is < 100
    && getnewelement() is string        // Other valdiations...

    function getsubstr(str, from, to) {
      return str[from:to];
    }
    function geteventarrayname() {
      return getsubstr(input, "events.".size(), request.writeFields[0].size());
    }
    function geteventarray(map) {
      return map.get(["events", geteventarrayname()], [])
    }
    function geteventarray_after() {
      return geteventarray(request.resource.data);
    }
    function geteventarray_before() {
      return geteventarray(resource.data);
    }
    function getnewelement() {
      return geteventarray_after()[geteventarray_after().size()-1];  // It is added at the end
    }

编辑:这是未经测试的,但应该是一个好的开始


推荐阅读