如何允许匿名者仅更新一次Firestore文档?

时间:2019-08-22 06:50:00

标签: google-cloud-firestore firebase-security

我尝试为我的新Firestore数据库找到正确的安全规则。

为简化起见,我的Web应用程序具有一个问题列表,可以通过“是”或“否”来回答。该应用程序提示匿名用户一个随机的问题,他们回答是或否,并提示另一个问题。 稍后,用户可以看到带有响应细分的问题列表(即30%是,70%否)

我想确保我的应用程序不会被恶意软件滥用,例如,发送1000个请求以回答同一问题。

我正在观看有关Firestore的安全规则视频,但找不到一种只能让合法答案通过的模式。

有指针吗?

1 个答案:

答案 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;
    }             
  }
}

注意:请确保您不将匿名用户限制为他尚未回答的其他问题。

希望这些指针有帮助。