【问题标题】:Firestore security rule should not allow deletion, but it allowsFirestore 安全规则不应允许删除,但它允许
【发布时间】:2020-04-01 03:43:35
【问题描述】:

Firebase 安全规则似乎不起作用。

我希望禁止删除其他人的对象。 我配置了删除规则:

if resource == null || request.auth.uid == resource.data.owner

如果用户尝试删除其他对象,我有测试验证请求失败。但是,请求成功。

这些是我所有的安全规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{collection}/{document} {
      allow create: 
        if request.auth.uid == request.resource.data.owner

        && (collection != "Person" 
            || request.resource.data.owner == request.resource.data.id)
      allow update: 
        if request.auth.uid == resource.data.owner
        && request.auth.uid == request.resource.data.owner

        && (collection != "Person" 
            || request.resource.data.owner == request.resource.data.id)
      allow get, delete: 
        if resource == null
        || request.auth.uid == resource.data.owner
      allow list:
        if collection == "XfCard"
    }
  }
}

可能缺少什么?

【问题讨论】:

  • 如果没有与之配对的数据和查询,规则就没有多大意义。请编辑问题以显示查询(所有准确值 - 无变量),它正在使用的确切数据。

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


【解决方案1】:

resource.data.owner 更像是一条路径,而不是可用于与另一个比较的变量。考虑到这一点,通常需要将其设置为特定路径,而不仅仅是执行直接的常规比较。

正如来自社区here 的另一个问题所见,通常需要将所有者与文档所有者的路径进行比较,或多或少类似于以下代码:

if resource.data.owner == /databases/$(database)/documents/users/$(uid_owner)

这样,您应该能够使用它并确认与文档相关的所有者的身份。

除了检查上面的社区帖子并尝试使用上面的代码 - 未测试,但我相信这是一个很好的起点 - ,我建议你看看在官方文档下方,您可以找到有关组查询安全规则的更多信息。

如果这些信息对您有帮助,请告诉我!

【讨论】:

    【解决方案2】:

    调试后发现请求成功了,但是对象并没有被删除。 我的 HTTP 请求只是不返回错误消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多