Firestore规则:允许或限制请求每24小时仅发送一次?

时间:2019-02-27 20:18:21

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

是否存在一种本机或有效的方法来限制用户每24小时仅从集合中加载一次文档?

//Daily Tasks
//User should have only read rights
//User should only be able to read one document every 24h

match /tasks/{documents} {
allow read: if isSignedIn() && request.query.elapsedHours > 24;
}

我当时想我可以使用用户文档中的时间戳来做到这一点。但这会浪费不必要的编写资源,从而在每次请求任务文档时都向用户文档写入内容。因此,在以这种方式进行操作之前,我想确定是否有人有更好的方法。

有什么想法吗?非常感谢!

2 个答案:

答案 0 :(得分:0)

没有本机解决方案,因为安全规则无法写回到数据库中以记录查询。

您可以改为通过后端(例如Cloud Functions)强制进行访问,该后端还记录特定身份验证用户的访问时间,并将其与每次进行比较。请注意,每次调用都会产生额外的文档。

答案 1 :(得分:0)

目前尚无真正的“有效”方法,撰写本文时也没有本机。如果没有进一步的扩展,找到解决该“问题”的实际方法将很容易。

但是,有一些变通方法,例如用于Firebase的云功能,这些新方法可以打开新选项来解决firestore的各种限制。

当每个用户最后一次访问文档时,本机解决方案将在数据库中的某个位置进行跟踪。正如您提到的那样,这只会创建不必要的读写操作,而只是为了进行跟踪。

我希望在客户端上使用缓存机制,并允许用户执行多次读取。不要忘记,如果用户清除了设备上的缓存,他将不得不再次查询文档,并且如果您完全限制了他的话,根本不会获得任何数据。

由于您获得大量读取,我认为最好的方法是在客户端缓存并仅设置一个限制控件(请参见Request.query limit值)。如下所示:

match /tasks/{documents} {

  // Allow only signed in users to query multiple documents 
  // with a limit explicitly set to less than or equal to 20 documents per read
  allow list: if isSignedIn() && request.query.limit <= 20;

  // Allow single document read to signed in users
  allow get: if isSignedIn();
}