允许根据文档中的时间戳值读取FireStore规则

时间:2017-11-21 13:17:48

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

我想创建一个FireStore规则,该规则在当前日期超过文档中的时间戳值后,将读取的特权文件读取到文档。

这适用于博客网络应用程序。 E.G博客设定了一篇博文,可在特定日期向公众开放。

通过阅读文档,这应该可行,但它不会。

service cloud.firestore {
  match /databases/{database}/documents {
    match /Articles/{article}{
   allow read: if request.time.date() < resource.data.date
    }
  }
}

我错过了什么?

6 个答案:

答案 0 :(得分:6)

firebaser here

我前一段时间尝试过同样的事情,发现目前还没有。

可以根据该文档的属性允许/拒绝对特定文档的读取。

可以允许查询根据该文档中的属性过滤文档,但目前只能基于request.auth进行过滤。

这意味着很遗憾,您的过滤器目前无法使用安全规则实施。我建议你file a feature request加入。

更新(2018-04-24):{em}可能现在可以使用request.time,但我还没有机会参加考试然而。看看here

答案 1 :(得分:2)

尝试切换&lt;到&gt;。

request.time将是访问文档的时间,而resource.data.date应该是文档的创建时间戳。

尝试将此用于您的安全规则:

    allow read: if request.time > (resource.data.timestampPropertyName + duration.time(1, 0, 0, 0));

duration.time(4,3,2,1)将创建一个4小时,3分钟,2秒,1纳秒的持续时间。

更多信息可在以下网址找到: https://firebase.google.com/docs/firestore/reference/security/#timestamp

请务必在保存安全规则后等待一段时间才能生效!

答案 2 :(得分:1)

注意::由于这是我对Stack Overflow的第一个答案,因此我无权评论Frank van Pueffelen的答案,因此,请注意,这个解决方案是他的!

请求中有一个时间戳记request.time,Firestore允许对timestamp <> timestamp操作进行基本的数学运算符,因此您的request.time < resource.data.date可以工作;)

service cloud.firestore {
  match /databases/{database}/documents {
    match /Articles/{article}{
   allow read: if request.time < resource.data.date
    }
  }
}

这是基于我在2018.09.29的个人测试

答案 3 :(得分:0)

@ user776914的答案很好,但是如果存在差异时区怎么办

让我们增加+-27小时,以确保例如在当天创建的+-1

<li>

What's max timezone offset

答案 4 :(得分:0)

我想为游戏做类似的事情。我只想在特定日期之后激活和停用游戏对象。我用谷歌的云功能做到这一点。我部署了每天运行的功能,以检查Firestore文档并根据脚本更改值。

答案 5 :(得分:0)


将此规则添加到 fire-store db 的规则部分。

[https://firebase.google.com/docs/firestore/security/get-started][1]

 service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}