【问题标题】:How to allow anonymous to update a Firestore document but just once?如何允许匿名更新 Firestore 文档但只更新一次?
【发布时间】:2019-08-22 06:50:00
【问题描述】:

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

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

我想确保我的应用程序不会被恶意人员滥用,例如通过发送 1000 请求以对同一问题回答“是”。

我正在观看有关 Firestore 的安全规则视频,但找不到仅允许合法答案通过的模式。

任何指针?

【问题讨论】:

    标签: google-cloud-firestore firebase-security


    【解决方案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
    

    解决方案:现在我们知道给定问题的现有答案,如果用户拥有唯一的答案,我们可以为答案子集合编写限制创建新答案的安全规则在用户集合中他/她的用户文档的已回答问题数组中已经存在 questionId。

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

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

    希望这些指点有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 2021-05-15
      相关资源
      最近更新 更多