【问题标题】:FireStore Rules check if record is being inserted or updatedFireStore 规则检查是否正在插入或更新记录
【发布时间】:2017-11-28 14:02:34
【问题描述】:

我在我的 firebase 项目上设置了以下 firestore 规则

service cloud.firestore {
    match /databases/{database}/documents {
        match /news/{news} {
            allow read: if true;
            allow write: if request.auth != null
                         // && (
                               // (resource == null && request.resource.data.author == request.auth.uid) || 
                               // request.auth.uid == resource.data.author == request.resource.data.author || 
                               // get(/users/$(request.auth.uid)).role in ["editor", "admin"]
                            // )
                         && request.resource.data.keys().hasAll(['title', 'body', 'images', 'tags', 'source', 'web_link', 'created_at', 'updated_at', 'author'])
                         && request.resource.data.title is string && request.resource.data.title.size() >= 10 && request.resource.data.title.size() <= 100
                         && request.resource.data.body is string && request.resource.data.body.size() >= 300 && request.resource.data.body.size() <= 500
                         && request.resource.data.images is list && request.resource.data.images.size() >= 0
                         && request.resource.data.tags is list && request.resource.data.tags.size() >= 0
                         && request.resource.data.source is string && request.resource.data.source.size() > 0 && request.resource.data.title.size() <= 100
                         && request.resource.data.web_link is string && request.resource.data.web_link.size() > 0
                         // && request.resource.data.created_at is timestamp
                         // && request.resource.data.updated_at is timestamp
                         ;
        }
        match /users/{userId} {
            allow read, write: if request.auth.uid == userId || get(/users/$(request.auth.uid)).role == "admin"
        }
        match /{document=**} {
            allow read, write: if false;
        }
    }
}

上面注释的行不起作用

  • 我需要检查资源是否正在插入或更新,resource == null 部分不起作用
  • created_at 和 updated_at 包含时间戳,而 is timestamp 不起作用

如果有人想知道,resource.data.author 包含用户的uid

【问题讨论】:

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


    【解决方案1】:

    从the documentation,写入可以细分为:

    • 创建
    • 更新
    • 删除

    所以,在这种情况下,你会想要这样的东西:

    service cloud.firestore {
      match /databases/{database}/documents {
        match /news/{news} {
          //read rules here...
          allow create: if true; 
          allow update: if true; 
          allow delete: if true; 
        }
      }
      //other rules here...
    }
    

    还有good documentation for validating timestamps。我强烈建议尽可能使用firebase.firestore.FieldValue.serverTimestamp()。

    【讨论】:

      【解决方案2】:

      我在文档中寻找相同的详细信息,以下内容适用于我使用时间戳,如果我尝试发送字符串则失败(其中“lastUpdated”应该与您的日期属性交换)

      request.resource.data.lastUpdated.date() is timestamp
      

      【讨论】:

        猜你喜欢
        • 2016-03-24
        • 2021-09-13
        • 2016-02-29
        • 2015-12-18
        • 2012-03-06
        • 2015-10-04
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        相关资源
        最近更新 更多