【问题标题】:How can you write a security rule to ensure that a user can write to a cloud firestore document only once?您如何编写安全规则以确保用户只能向 Cloud Firestore 文档写入一次?
【发布时间】:2020-07-14 21:04:55
【问题描述】:

我正在使用 firebase 创建一个投票应用程序,我需要写下一个安全规则,该规则允许用户仅写入一次文档。我想创建一个已写入文档的用户的用户 ID 列表,然后创建一个规则来检查新请求是否来自已经投票的用户。但是,问题是我将不得不从客户端创建这样一个用户列表,这是不安全的。谁能告诉我如何解决这个问题?

【问题讨论】:

  • “问题是我必须从客户端创建这样一个不安全的用户列表” - 确保它是安全的。您的安全规则可以检查用户的 uid 是否已用于编写文档,只要您限制用户如何编写自己的 UID。
  • @DougStevenson 用户不可能写入存储其投票的文档但不能写入列表。我想不出一种方法来确保他总是将他的 uid 添加到列表中。
  • 如果您的规则要求用户将他们的姓名添加到列表中(通过比较列表的前后值),或者甚至创建另一个文档作为批处理/事务的一部分,那么它将被强制执行。

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


【解决方案1】:

只需通过一个规则强制执行,即当用户写入文档时,他还必须将自己添加到列表中。简单例子:

match /docs/{docid} {
  allow update: if userNotInList() && userAddedToList()
    && ... // Add more conditions as needed
  
  function userNotInList() {
    return !exists(/databases/$(database)/documents/docs/$(docid)/userlist/$(request.auth.uid));
  }
  function userAddedToList() {
    return existsAfter(/databases/$(database)/documents/docs/$(docid)/userlist/$(request.auth.uid));
  }
  match /userlist/{userid} {
    allow create: if userid == request.auth.uid
      && request.resource.data.time == request.time  // For instance
      && ... // Add more conditions as needed
}

而且你必须批量编写两个文档

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 2018-12-26
    • 2019-11-02
    • 1970-01-01
    • 2019-05-20
    • 2019-12-31
    • 2018-04-22
    • 1970-01-01
    相关资源
    最近更新 更多