问题 使用访问规则中的字段写入Firestore时缺少权限或权限不足


尝试写入Firestore时出错。

我试图使用包含用户uid的字段作为我的安全规则。

service cloud.firestore {
  match /databases/{database}/documents {

    match /messages/{document=**} {
      allow read: if resource.data.user_uid == request.auth.uid;
      allow write: if resource.data.user_uid == request.auth.uid;
    }
  }
}

如果我的Firestore数据库中有数据,则读取规则正常 - 但是当我尝试编写时,我得到: Error: Missing or insufficient permissions. 我写这条规则有什么问题吗?

附:如果我将规则更改为此,我可以写入我的数据库 - 但这对我的目的来说不够安全:

 match /messages/{document=**} {
      allow read: if resource.data.user_uid == request.auth.uid;
      allow write: if request.auth != null;
    }

1397
2017-10-08 20:39


起源



答案:


resource.data 指的是已存储的数据,因此您的规则允许用户仅更新已包含其用户ID的数据。

你可能想要检查的是 request.resource.data 这是新数据的来源。

这里有关于这些字段和其他安全规则的相当广泛的文档: https://firebase.google.com/docs/firestore/security/rules-conditions


11
2017-10-08 21:02



谢谢你的工作。 Firebase文档需要更新,他们只给出了读取的例子,他们应该给出写的例子.... - Leo Farmer
@LeoFarmer这里有一个关于不同安全规则的相当广泛的文档: firebase.google.com/docs/firestore/security/secure-data - Scarygami
只要他们尝试使用他们的uid更新数据,是否会允许其他用户覆盖您的数据?也许做粒度创建,如果不存在并请求uid匹配,仅在现有数据uid匹配时执行删除,并且仅在请求和现有uid匹配时才更新? - Jason Goemaat
你好,欣赏这个!我想知道你是否能够对我的问题有所了解 stackoverflow.com/questions/50929366/... ?非常感谢! - Michael Stokes
链接不再有效 - Jviaches


答案:


resource.data 指的是已存储的数据,因此您的规则允许用户仅更新已包含其用户ID的数据。

你可能想要检查的是 request.resource.data 这是新数据的来源。

这里有关于这些字段和其他安全规则的相当广泛的文档: https://firebase.google.com/docs/firestore/security/rules-conditions


11
2017-10-08 21:02



谢谢你的工作。 Firebase文档需要更新,他们只给出了读取的例子,他们应该给出写的例子.... - Leo Farmer
@LeoFarmer这里有一个关于不同安全规则的相当广泛的文档: firebase.google.com/docs/firestore/security/secure-data - Scarygami
只要他们尝试使用他们的uid更新数据,是否会允许其他用户覆盖您的数据?也许做粒度创建,如果不存在并请求uid匹配,仅在现有数据uid匹配时执行删除,并且仅在请求和现有uid匹配时才更新? - Jason Goemaat
你好,欣赏这个!我想知道你是否能够对我的问题有所了解 stackoverflow.com/questions/50929366/... ?非常感谢! - Michael Stokes
链接不再有效 - Jviaches


这个问题和接受的答案对我来说非常有用。我最终使用了一组略有不同的规则,我将在这里分享,因为其他人发现它们很有用。

像OP一样,我存储了一个用户ID(uid)用我的资源。但是,当我想创建一个新资源时,没有 uid 然而。用一个 文档中的示例 我最终得到了如下所示的安全规则:

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

2
2017-07-16 20:56