【问题标题】:Firebase Security Rules with wildcards (Permission denied even though access is granted)带有通配符的 Firebase 安全规则(即使授予访问权限,权限也被拒绝)
【发布时间】:2021-10-20 19:42:45
【问题描述】:

下面是我的firestore数据库

消息子集合如下所示:

以下是我的安全规则。

match /channels/{channelID=**} {
    allow read: if request.auth.uid in resource.data.participants;
    allow write: if request.auth.uid in resource.data.participants;

但是,当我尝试使用下面的代码收听消息集合中的消息文档时

firestore.collection('channels').doc(channelId).collection('messages').snapshots()

我收到以下错误:

flutter: [cloud_firestore/permission-denied] 调用者没有 执行指定操作的权限。

8.3.0 - [Firebase/Firestore][I-FST000001] 在通道/RILvs2HvV8OiYrsk0W0ZxhxaU8H3-EpPAVCmuYnTWGxvASNk5rgUHTe63/messages 处侦听查询 失败:权限缺失或不足。

我已允许访问安全规则中带有 =** 的所有子集合和文档,但我不确定为什么权限仍然被拒绝?任何意见,将不胜感激。谢谢!

【问题讨论】:

  • 您正在尝试访问频道 ID:"RILvs2HvV8OiYrsk0W0ZxhxaU8H3-EpPAVCmuYnTWGxvASNk5rgUHTe63",如错误所示。在您的屏幕截图中,ID 以Gmf.. 开头,您可以在查询前print(channelId) 并检查其是否有效?
  • 嗨@Dharmaraj,是的,我将其截图作为示例。但我重新上传了屏幕截图以使其更清晰。
  • 嗨@Dharmaraj,为了更清晰,我添加了上面消息子集合和文档的屏幕截图
  • @scottlee 将 sub collection 名称添加到您的路径中。 match /channels/{channelID=**}/messages/{messageId=**}

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


【解决方案1】:

问题在于您正在尝试读取消息子集合中的文档,因此resource.data 将是这些消息文档的数据,而不是频道文档的数据。但是,participants 数组存在于通道文档中,因此请使用 get() 来读取该文档的数据,如下所示。

match /channels/{channelId}/messages/{messageId} {
    allow read, write: if request.auth.uid in get(/databases/$(database)/documents/channels/$(channelId)).data.participants;
}

如果您在此处使用递归通配符,则 channelId 的值将是 "/RILvs2HvV8OiYrsk0W0ZxhxaU8H3-EpPAVCmuYnTWGxvASNk5rgUHTe63/messages/JR12q13OvpYISJmHilcq"(在此示例中),但 get() 中的路径应该只是 /channels/{channelId}

【讨论】:

  • @scottlee 如果您在客户端使用监听器,这并不重要。您需要阅读频道文档以检查参与者数组,因此您在安全规则中使用get()。这与您在客户端的代码无关。请尝试复制上述规则。本质上,当使用resourcee.data 时,规则将尝试在未定义的消息文档中查找参与者数组。
  • 嗯,即使使用了规则,同样的错误仍然存​​在。
  • @scottlee 请尝试更新的答案。有一个错字channelID 而不是channelId,也许你必须使用完整路径而不是递归通配符
猜你喜欢
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2021-10-31
  • 2021-12-18
  • 2020-09-11
  • 2018-06-05
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多