【问题标题】:Is there an alternative to writeFields?有没有 writeFields 的替代品?
【发布时间】:2019-11-03 15:38:28
【问题描述】:

This article 声明“[writeFields] 现已弃用”。
此外,我找不到writeFields 的任何文档,它甚至不再作为Request 的一部分在文档中列出。

问题

我在使用 Cloud Firestore 安全规则时面临的问题是,验证是否仅修改了特定字段需要大量条件。
例如,如果我想验证一个文档的唯一修改值是cakes,我必须编写如下规则:

allow update: if request.resource.data.size() == 20
              && request.resource.data.likes == resource.data.likes
              && request.resource.data.name == resource.data.name
              && request.resource.data.date == resource.data.date
              && request.resource.data.body == resource.data.body
              && request.resource.data.title == resource.data.title
              && request.resource.data.tags == resource.data.tags
              && request.resource.data.comments == resource.data.comments
              && request.resource.data.answers == resource.data.answers
              && request.resource.data.awards == resource.data.awards
              && request.resource.data.image == resource.data.image
              && request.resource.data.link == resource.data.link
              && request.resource.data.format == resource.data.format
              && request.resource.data.type == resource.data.type
              && request.resource.data.user == resource.data.user
              && request.resource.data.views == resource.data.views
              && request.resource.data.reports == resource.data.reports
              && request.resource.data.roles == resource.data.roles
              && request.resource.data.category == resource.data.category
              && request.resource.data.votes == resource.data.votes
              && request.resource.data.cakes is int;

使用writeFields完全相同规则如下所示:

allow update: if request.writeFields.hasOnly(['cakes']) && request.resource.data.cakes is int;

我可以做些什么来减少我的规则的代码大小/writeFields 的替代方法是什么?

限制

文档中提到了两个limits,使这个问题更加严重:

  • 每个请求评估的最大表达式数:1,000

  • 规则集的最大大小:64 KB

我希望在这个限制下在某个时候达到这两个目标。

【问题讨论】:

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


    【解决方案1】:

    是的!现在有一个名为“地图差异”的替代品。检查此语法:

    allow update: if request.resource.data.diff(resource.data).affectedKeys().hasOnly(['cakes']) 
                  && request.resource.data.cakes is int;
    

    【讨论】:

      【解决方案2】:

      很遗憾,您现在正在做的事情是目前最好的选择。

      Firebase 规则团队正在努力改进语言,以便更轻松地比较/区分地图类型对象,这将大大减少执行此类操作所需的表达式数量,但没有具体时间表现在。请继续关注。

      【讨论】:

        【解决方案3】:

        我最终编写了这些辅助函数:

        // returns true if all the fields changed are contained in the array parameter
        function onlyAllowedFields(fieldsArray) {  
          return fieldsArray.toSet().hasAll(request.resource.data.diff(resource.data).affectedKeys());
        }
        
        // returns true if none of the fields are changed
        function noneOfDisallowedFields(fieldsArray) {  
          return request.resource.data.diff(resource.data).affectedKeys().hasAny(fieldsArray.toSet()) == false
        }
        

        我发现这种方式比使用要求所有可以更改的字段都必须更改的 hasOnly() 更有帮助。

        【讨论】:

          猜你喜欢
          • 2011-04-26
          • 1970-01-01
          • 1970-01-01
          • 2020-07-26
          • 2015-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          相关资源
          最近更新 更多