是否存在一种本机或有效的方法来限制用户每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;
}
我当时想我可以使用用户文档中的时间戳来做到这一点。但这会浪费不必要的编写资源,从而在每次请求任务文档时都向用户文档写入内容。因此,在以这种方式进行操作之前,我想确定是否有人有更好的方法。
有什么想法吗?非常感谢!
答案 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();
}