google-cloud-firestore - 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
:
感谢您的任何帮助或指点!
解决方案
所以我走了一条不同的路,只是为了让安全规则逻辑和维护更容易一些。
我只是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 更容易一些。
推荐阅读
- python - 寻找最常见的元素
- javascript - 添加小时迄今未按预期工作
- javascript - 无法在 FireFox 上编辑 contenteditable div
- java - minCompileSdk (android-30)。依赖:androidx.lifecycle:lifecycle-livedata-ktx:2.4.0
- java - com.jcraft.jsch.JSchException:算法协商失败,出现此错误
- flutter - 颤振构建apk AssemblyRealese失败
- javascript - 当我点击图片时,我试图弹出一个警报
- python - 如何将多步 mrjob 与 json 文件一起使用
- api - 使用 ADF SF 连接器将数据加载到 Salesforce
- python - 如何使用 Attention 实现多层 Seq2Seq 模型?