【问题标题】:Firestore Security Rules Shared Document by GroupFirestore 安全规则按组共享文档
【发布时间】:2021-06-21 15:28:56
【问题描述】:

我有一种情况,用户可以创建一个文档,然后与一组其他用户共享。他们可以将其分享给多个不同的组。我不知道如何为此设置规则。

这是数据库结构:

因此,在组中,您有一个已共享给它的文档列表。我的应用程序加载用户所在的组,然后想要加载文档数组中的所有文档。我需要一种方式服务器端说这没关系。到目前为止,只有文档的所有者可以阅读它。

我在每个文档中放置了一个字段,其中包含与其共享的每个组的 ID。我想我想说“检查用户是否是 sharedToGroups 中任何组的成员”列表,但我无法弄清楚如何做到这一点,除非我在 userProfile 文档中的某个地方维护另一个列表,其中包含一个圆圈列表用户是其中的一员。即便如此,我也会尝试比较 2 个列表,但我不确定我能否做到这一点。

如果能够以某种方式从发出请求的位置获取组 ID 并查看它是否在 sharedToGroups 数组中,那就太好了。

任何关于如何实现这一点的帮助或 cmets 将不胜感激,也许它需要不同的数据库结构。

【问题讨论】:

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


    【解决方案1】:

    您可以尝试这种方法:

    我不确定这是否会对您有所帮助,但我想您也许可以为group 文档启用firestore 的权限。如在规则中,为组设置一个函数,该函数使用存储在文档中的用户 ID 验证用户,该用户 ID 通过 firebase auth 附加在身份验证中

    因此,与其尝试限制每个文档的访问,不如限制每个组的访问。

    【讨论】:

    • 嗨拉金杜,感谢您的回复。你能发布一些伪代码来说明你的意思吗?
    • 我在我的 user_profile 文档中添加了一个名为 groups 的字段。当您加入一个组时,它会将该组的 id 添加到组数组中。现在,如果您是所有者,或者在您的 user_profile 中您的组字段 resource.data.sharedToGroup.hasAny(get(/databases/$(database)/documents/user_profiles/$( request.auth.uid)).data['groups']);这似乎在在线模拟器中运行良好,但在我的本地模拟器上它给了我一个错误,但实际上看起来它无论如何都获取了文档。
    【解决方案2】:

    我将回答我自己的问题。不确定它是否是正确的协议(不是专业程序员或经验丰富的 Stack Overflower),但它可能会对某人有所帮助。

    我最终在 user_profiles 文档中添加了一个字段,该字段包含他们所在的每个组的列表。当我在组中创建和添加/删除人员以及组本身的成员列表时,需要维护此列表。

    这样做的好处是我可以使用请求对象中的用户 ID 从安全规则中的数据库中获取该文档。然后,我在尝试访问的文档中有一个“sharedToGroup”数组,在我也可以访问的 user_profile 中有一个“inGroups”数组。然后我使用 hasAny 运算符比较两个数组,如果 sharedToGroup 数组具有 inGroups 数组中的任何值,则允许访问。

    我的规则变成:

      match /_group/{groupId}{
          allow create: if isSignedIn();
          allow read: if isOwner() 
          || resource.data.sharedToGroup.hasAny(get(/databases/$(database)/documents/user_profiles/$(request.auth.uid)).data['inGroups']);
          allow write: if isOwner();
        }
    

    剩下要做的就是保护 user_profiles 文档,以确保即使用户也不能写入它,因为我不希望有人手动将组添加到他们的数组中。

    我希望有一天这可能对某人有所帮助 - 就像我说我在这里不是专业人士一样,所以请谨慎对待。

    【讨论】:

      猜你喜欢
      • 2020-06-19
      • 1970-01-01
      • 2019-03-03
      • 2019-02-01
      • 2020-07-04
      • 1970-01-01
      • 2019-10-15
      • 2019-07-23
      • 1970-01-01
      相关资源
      最近更新 更多