首页 > 解决方案 > Firestore 安全规则:如何获取文档并检查资源属性是否为真

问题描述

我需要一些帮助来编写 Firestore 安全规则。

我有一个名为posts如下示例路径的子集合:

/users/XrMD3azk4Jess5KNTSICv4RYEj02/posts/what-architecture-style-is-this_r3nosJHQIt

我正在构建一个“神秘博客”应用程序,用户可以在其中提交神秘信息(又名“帖子”),其他用户可以为神秘帖子提供答案(又名“评论”)。如果神秘帖子作者认为所提供的评论解开了谜团,则帖子作者可以继续并单击标有“选择作为答案”的按钮。

示例截图:

在此处输入图像描述

答案保存到answers用户记录中调用的子集合(提供答案的用户,又名“doss”)。这是带有屏幕截图的示例路径:

在此处输入图像描述

这工作正常。 但是,我显然只希望允许帖子作者按下“选择作为答案”按钮......我将为此编写前端逻辑,以便该按钮仅出现给帖子所有者。但是,如何正确编写后端 Firestore 规则以防止非帖子所有者用户恶意尝试编辑/选择答案?

我假设我需要检查帖子作者的 id(又名,uid)并查看它是否与登录用户的uid.

这是我尝试过的,但我在这里收到权限错误:

  match /users/{uid}/answers/{docId} {
    allow read;
    allow write: if request.auth != null; && get(/databases/$(database)/documents/users/$(request.auth.uid)/posts/$(id)).data.uid == uid
  }

uid这是包含作者和帖子的帖子文档的示例id

在此处输入图像描述

感谢您的任何帮助或指点!

标签: google-cloud-firestorefirebase-security

解决方案


所以我走了一条不同的路,只是为了让安全规则逻辑和维护更容易一些。

我只是postUid在创建answer文档时添加了一个属性:

    async selectAsAnswer(comment) {
      const answerDoc = this.$fire.firestore
        .collection(`users/${this.comment.uid}/answers`)
        .doc()
      await answerDoc.set({
        id: answerDoc.id,
        commentId: comment.id,
        postId: comment.postId,
        postUid: this.post.uid,
        createdAt: this.$fireModule.firestore.FieldValue.serverTimestamp(),
        commentUid: comment.uid
      })
    }

然后,在此答案文档的安全规则中,我检查了postUid属性匹配:

  match /users/{uid}/answers/{docId} {
    allow read;
    allow create, update: if signedInAndVerified() && request.resource.data.postUid == request.auth.uid;
  }

这似乎工作正常,它只是让整体 DX 更容易一些。


推荐阅读