【问题标题】:Limiting permissions to the author not working in Firestore rules限制作者的权限不在 Firestore 规则中工作
【发布时间】:2020-03-31 21:52:39
【问题描述】:

我正在尝试将我的 Firebase 规则从测试每个用户都可以读取和写入每个文档的测试转移到只有作者可以更新或删除他们创建的文档的测试。

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read: if request.auth != null;
      allow update, delete: if request.auth != null && request.auth.uid == resource.data.author_uid;
      allow create: if request.auth != null;
    }
  }
}

如果我尝试删除文档,这组规则会在 Firebase 初始化时导致“权限缺失或权限不足”错误。如果我遵循原始规则,那么一切正常。

allow read, create: if request.auth != null

我做了一个标准的 firebase.initializeApp(但不想在这里发布我的密钥 - 让我们说相同的初始化适用于基本规则以及我拥有的其他三个 firebase 项目)。删除调用如下,也适用于更简单的规则集,但不适用于上述更严格的规则:

const decrement = firebase.firestore.FieldValue.increment(-1);
firestore.collection('story').doc(storyid).delete().then(function() {
    firestore.collection('users').doc(getUserID()).update({
        saves: decrement 
    });
})

【问题讨论】:

  • 请编辑问题以显示未按您期望的方式工作的代码。仅仅看到规则是没有帮助的——代码和规则应该总是匹配的,我们需要看到这一点。我们还应该能够使用您提供的内容完全重现这种情况。
  • 好吧,因为 Firebase 没有告诉您代码在哪里失败,所以很难查明......而且我无法发布 init 以及每次调用 firestore 读取、写入和更新。我会在问题中添加一点,但第一级答案是“我的规则集是否适合我想做的事情,即只允许登录自己数据的人进行更新、删除和创建”?跨度>
  • Firebase 无法控制 Stack Overflow,我看到有两个不是 Firebase 工作人员的人投票结束了这个问题,可能是因为您的更新没有及时发布。按照 Stack Overflow 的惯例,它之所以被关闭,仅仅是因为有足够多的人同意它是题外话,而且这种情况一直都在发生。我建议阅读链接以了解如何提出更好的问题,并在您的修改后再次发布。
  • 作为一个小建议,我希望您将来会有所帮助-您在此处的第一个回复(已删除)说您认为您不必显示匹配的代码示例我在第一条评论中要求。这足以让潜在的问题审阅者在没有足够信息的情况下将其关闭为“离题”寻求调试帮助。现在您已经花时间添加了所请求的信息,似乎问题已重新打开。审核过程旨在帮助人们提出更好的问题。很抱歉给您带来了不好的体验。
  • 抱歉,在尽可能多地扩展代码示例之前,我先发表了第一条评论。它在我身上。当面对我遇到的规则问题时,下面的答案应该可以帮助人们并为他们提供更好的选择。谢谢

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


【解决方案1】:

(感谢 FB 团队的 Sam Stern 提供指导)

首先,规则描述有误。虽然 request.auth.uid 由 firebase 定义,但 resource.data.author_id 需要由开发人员在他们的每个文档上定义。在这种情况下,“故事”文档包含一个“创建者”属性,它是所有者的用户 ID。所以正确的变量应该是上述规则中的 resource.data.creator。

此外,还可以将 documentid 定义为用户 ID,当您在 Firebase 应用程序中为每个帐户创建“用户”对象时,通常会出现这种情况。在这种情况下,userId 与 documentId 相同,因此以下规则将控制仅允许该文档的所有者更改它的更新权限。

 match /users/{userId} {
   // In this scope the "userId" variable is equal to the documentId because of the wildcard declaration {userId}
   allow update: if request.auth.uid == userId;
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2021-06-13
    • 2019-08-20
    • 1970-01-01
    相关资源
    最近更新 更多