swift - updateData FieldValue.arrayUnion([value]) [swift] 的 Firebase Cloud Firestore 安全规则

标签 swift firebase google-cloud-firestore firebase-security

我在 Cloud Firestore 中有一个文档。

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

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

enter image description here

更新[ swift ]:

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

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

  1. 值(value)是独一无二的。也就是写的时候检查数组eventID-1,eventID-2,eventID-3....中是否不存在该值。

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

我只是想出了如何检查传入的数据,它是一张 map ,我们只得到一个值。

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

更新: 已处理:

  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

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

最佳答案

这是一个尝试:

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
    }

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

关于swift - updateData FieldValue.arrayUnion([value]) [swift] 的 Firebase Cloud Firestore 安全规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60455280/

相关文章:

swift - 无法为 ImageView 设置正确的框架

ios - 以同步顺序运行异步任务

ios - 从 Firebase for Swift 中的查询检索数据

ios - 横向拖放图像不起作用

java - Android Studio : Firestore: RecyclerView not displayed and error

firebase - 如何使用 Flutter 从 firebase 中的两个集合中获取数据

javascript - 我的 Firebase 网站始终只允许一名用户登录,为什么?

firebase - 在StartDate和EndDate Firestore之间

javascript - 时间戳验证 Firestore

google-cloud-firestore - 使用电子邮件地址作为 firestore 中的键