【问题标题】:Firestore rules to allow write on two separate UidsFirestore 规则允许在两个单独的 Uid 上写入
【发布时间】:2019-10-08 12:03:14
【问题描述】:

我正在编写一个聊天应用程序,并在安全规则部分之外完成。我目前正在为每条消息创建两个文档(每个用户一个)我可以将文档写入我的用户 ID,但数据库不允许写入另一个配对的用户 ID。

如果 userId 在另一个文件的 resource.data 中,我已经尝试允许写入

match /message/{user}/{chatRoomID}/{messageId} {
  allow read, write: if request.auth.uid == user || request.auth.uid in resource.data;
}

我怎样才能做到每当一条消息被发送到数据库时,它只能被特定的用户 ID 读取并且可以被写入? 每个消息对象都引用了谁发送它(每个用户的对象 ID)。提前致谢!!

【问题讨论】:

  • 请编辑您的问题以包含编写消息并被拒绝的最小、完整/独立代码。查看示例文档的屏幕截图也很有用。
  • 这个request.auth.uid in resource.data 子句似乎不太可能是正确的。您更有可能需要包含包含其他用户 UID 的字段,并使用 == 进行比较。

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


【解决方案1】:

虽然in 确实是安全规则中的运算符,但这不起作用:

request.auth.uid in resource.data

in 运算符检查地图中是否存在 key,您更有可能将其他用户的 UID 存储在 value 中一个字段。

要检查某个字段是否具有特定值,请使用以下内容:

request.auth.uid == resource.data.senderID

【讨论】:

  • 这对我不起作用。是因为 senderId 文件不在直接路径中吗?我应该改写 resource.data.chaRoomId.MessageId.senderId 吗??
  • 安全规则需要匹配,但是您将发件人的 UID 存储在文档中。这取决于您的文档结构,这就是为什么我要求您在问题中添加代码/屏幕截图。
  • 谢谢。除了字段名称(我刚刚在我的答案中更新以匹配您的屏幕截图),这应该可以工作。如果没有,请更新您的问题以提供minimal, complete/standalone code that writes the message and gets rejected
  • 我尝试了各种可能性,但这仍然不起作用。我不仅需要能够将消息发布到 /message/myUID ,还需要将消息发布到 /message/myBoundUID ,因此上述代码最终无法正常工作。我该怎么办??
  • 编辑您的问题以包含重现问题的代码。请参阅 my initial commentmy second comment under my answer
猜你喜欢
  • 1970-01-01
  • 2021-09-22
  • 2021-05-14
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 2018-01-05
  • 1970-01-01
相关资源
最近更新 更多