【问题标题】:Limit firestore document creation by one document per user using firebase rules使用 firebase 规则限制每个用户创建一个文档的 firestore 文档
【发布时间】:2021-03-01 17:23:46
【问题描述】:

我有一个Questions 收藏。里面是一个嵌套集合Responses。因此,可以在该特定文档中找到对特定问题的所有回答。

我必须限制用户对同一个问题发送多个回复。

目前,我在服务器端 (admin-SDK) 上执行此操作,方法是将用户的 uid 保存在响应文档中。

 firestore
    .collection("questions")
    .doc(questionID)
    .collection("responses")
    .where("uid", "==", AuthUser.id)
    .get().then(snapshot => {
      if (snapshot.docs.length == 0) {
        let createdAt = Date.now()
        firestore
            .collection("questions")
            .doc(questionID)
            .collection("responses")
            .add({
              uid: AuthUser.id,
              answer,
              createdAt,
              updatedAt: createdAt
        }).then(() => {
            return res.status(200).json({ msg: 'Success' })
        })
      } else {
        return res.status(400).json({ error: 'You cannot send more than one response' })
      }
    })

有没有办法通过 firebase 安全规则实现这种行为?

【问题讨论】:

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


    【解决方案1】:

    执行此操作的最简单方法是让用户写入 ID 与其用户 ID 相同的文档,而不是随机 ID。如果您没有将 userId 存储在文档的 ID 中,那么您将不得不遍历所有现有响应以检查用户是否提交了多个响应。

    firestore
        .collection("questions")
        .doc(questionID)
        .collection("responses")
        .doc(user.uid)
        .set({ ..... })
    

    如果您让用户写入 ID 与他们的用户 ID 匹配的文档,那么构建您的规则非常简单,这样人们只能编辑自己的响应。

    这是一个示例,任何人都可以阅读回复,并且人们只能创建/更新/删除自己的文档。这确保他们只能提交一个响应,因为他们只能在这一键上写入数据。

    service cloud.firestore {
      match /databases/{database}/documents {
      match /Questions/{questionId}/responses/{responseId} {
    
        allow create, update, delete: if request.auth.uid == responseId;
        allow read: if true;
      }
      }
    }
    

    【讨论】:

    • 正如您的回答所说,这是最简单的方法。我只考虑如何通过更改security-rules 来做到这一点,从未想过更改文档结构。谢谢你。
    猜你喜欢
    • 2021-10-25
    • 2018-06-21
    • 1970-01-01
    • 2021-03-17
    • 2018-10-09
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    相关资源
    最近更新 更多