当前位置: 首页 > 知识库问答 >
问题:

具有查询权限的Firestore安全规则“exists()”

上官琦
2023-03-14
users
  userUid
    { userData }
  ...
groups
  groupID
    { groupData }
    members
      member1uid
        { memberData }
      ...
    messages
      message1
        { messageData }
      ...
function isMemberOfGroup(groupId) {
  return exists(/databases/$(database)/documents/groups/$(groupId)/members/$(request.auth.uid))
}

match /groups/{groupId} {
  allow read: if isMemberOfGroup(groupId)
}


问题是我不能使用具有这些规则的查询,因为(我发现)无法根据子集合是否包含某个文档进行查询。这意味着我不能列出某个用户所属的所有组。我尝试在作为groupdata一部分的映射中列出所有用户,但我无法设置谁可以编辑文档的某些部分的权限,因此这也不起作用。

编辑:据我所知,查询必须以某种方式与规则匹配,否则权限将被拒绝。如何创建一个查询来收集某个用户所在的所有组并满足此规则。

共有1个答案

宇文良骏
2023-03-14

Firebase安全规则不会自己过滤数据。相反,它们决定允许哪些读操作/查询。

因此,如果成员只能读取他们所属的组,则像firebase.firestore().collection('groups').get()这样的读取将永远不会起作用。

您将始终必须在查询中复制“仅限成员”逻辑。只有当关于成员资格的数据在文档本身中时,这才是可能的,因为单个查询/读取只能从单个集合/组中读取。由于在您的数据结构中,授权所依赖的数据位于不同的集合中,我认为您不能安全地查询它,尽管您可以保护对单个文档的访问。

 类似资料:
  • 假设我有一个集合,其中包含子集合。餐厅权限设置在餐厅文档中,如下所示: 餐馆 任何有权访问餐厅的人也可以访问它的任何子集合,包括子集合。这是安全规则: 安全规则 查询餐厅列表可以这样完成,而且效果很好: 查询餐厅 现在如何查询子集合?我知道Firestore需要根据查询推断权限,而不查看底层数据。从逻辑上讲,这应该是可能的,因为任何可以访问的人也可以访问子集合。但是我如何组合这个子集合查询,以便F

  • 我的Firestore数据库有一些用户和一些s。如果没有其他人认领,用户可以认领。他们通过在上创建一个文档来声明,该文档有一个名为的字段,该字段是对他们自己的用户文档的引用。 我想我已经在这些安全规则中捕捉到了: 但是,当为所有权删除文档时,我获得了: 我是这样做的: 如果我打开read和write设置为true的文档,就不会出现此异常。 我的规则怎么了?他们用模拟器测试正常。

  • 最近我收到了一系列Firebase通知,涉及: [Firebase]您的Cloud FiRecovery数据库有不安全的规则 我们检测到您的安全规则存在以下问题:任何用户都可以写入您的整个数据库。因为您的项目没有强大的安全规则,任何人都可以访问您的整个数据库。攻击者可以窃取、修改或删除您的数据,并会抬高您的账单` Edit2:我需要的是允许每个人都写,而不需要登录,但是只有管理员帐户应该能够从Fi

  • 意向行为 目标是修改我的安全规则,以便只有经过身份验证的用户才能读写该特定用户的数据。这是基于users UID,这是我们如何识别单个用户的(这是通过firebase身份验证完成的,所以不确定问题是什么)。 我的数据库结构 FirebaseError:权限缺失或不足 任何关于我在这里能做什么的建议都将不胜感激。我在其他问题中找不到任何适用的东西。 我的查询 *我的错误

  • null 基本上数据结构如下所示: 问题是,我应该写什么安全规则来允许用户只在他们所属的组中(拥有组密钥)读取、创建和更新数据?同时,如何禁止用户找出其他群组的密钥?

  • 我在自学firestore,我想不出一种方法,只允许用户更新、删除或阅读他们添加的集合。 我使用firebase auth进行用户处理。对于每个集合,我将作为保存在数据库中。 这是我的规矩 当我试图读取/获取数据时,我得到错误。 我正在使用firestore的web api(JavaScript)。这是我用来读取数据的代码。