我尝试为我的新Firestore数据库找到正确的安全规则。
为简化起见,我的Web应用程序具有一个问题列表,可以通过“是”或“否”来回答。该应用程序提示匿名用户一个随机的问题,他们回答是或否,并提示另一个问题。 稍后,用户可以看到带有响应细分的问题列表(即30%是,70%否)
我想确保我的应用程序不会被恶意软件滥用,例如,发送1000个请求以回答同一问题。
我正在观看有关Firestore的安全规则视频,但找不到一种只能让合法答案通过的模式。
有指针吗?
答案 0 :(得分:1)
Google Cloud Firestore安全规则允许您控制对数据库中文档和集合的访问。这些规则使您可以创建匹配所有内容的规则,从对整个数据库的所有写入到对特定文档的操作。这还取决于您在Cloud Firestore中构造数据的方式。
问题:如您的问题所述,我假设您需要实施Firestore安全规则,以便匿名用户只能回答一次任何问题。
因此,考虑到您的要求,为每个数据库收集问题和每个问题的子收集答案将是理想的方法。还有另一个集合,用于存储每个用户的浏览器指纹,可用于基于用户显示统计信息。数据库的架构如下所示。
问题集合
Questions
-question1
-Answers (subcollection)
-answer1
-answer
-userId //unique id for each anonymous user
-answer2
-answer
-userId
-question2
-Answers (subcollection)
-answer1
-answer2
用户集合
Users
-user1
-userId //Unique browser fingerprint or any uniqueId to distinguish anonymou users
-answeredQuestions // Array of questionIds of answered questions
解决方案:现在,我们知道了给定问题的现有答案,如果用户具有唯一性,我们可以为答案子集合编写安全规则,以限制创建新答案在他/她的用户文档(位于用户集合中)的answeredQuestions数组中已经存在问题ID。
service cloud.firestore {
match /databases/{database}/documents {
match /Questions/{questionId}/Answers/{answerId} {
//Only restricting new answers
allow create: if (! questionId in getUserData(request.resource.data.userId).answeredQuestions;
}
//Function to get the user information
function getUserData(userId){
return get(/databases/$(database)/documents/Users/$(userId)).data;
}
}
}
注意:请确保您不将匿名用户限制为他尚未回答的其他问题。
希望这些指针有帮助。