【问题标题】:Firestore schema that supports group write access支持组写入访问的 Firestore 架构
【发布时间】:2021-11-03 17:47:25
【问题描述】:

我正在尝试设计一个 firestore 架构,它允许许多组的人只编辑他们自己组的文档,但服务范围内的任何人都可以阅读它们。 Firestore 的安全规则设置似乎无法实现。

基于角色的访问

Firebase 支持role-based access control,但它适用于整个服务范围的文档,我无法支持很多组。

自定义角色是通过 gcloud 控制台创建和分配的,因此我无法为每个组创建新的动态自定义角色,以便他们拥有自己的组。

Firestore 触发器复制文档

我考虑使用 Firestore 触发器(onCreate、onUpdate、onDelete)将文档复制到同一组中的其他用户的子集合中。这样做的问题是它可能会创建一个无限循环的触发器,因为每个成员都可以更新一个文档。理论上,您可以在复制的文档上使用属性集来防止这种情况发生,但感觉有点笨拙和脆弱。

是否有最佳实践,或者 Firestore 无法做到这一点?

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    Custom Claims 的 Firebase 身份验证可能非常适合此用例。您可以添加声明 groupId 并将其值设置为用户所属组的 ID。如果用户可以是多个组的一部分,则存储groupIds 的数组。您可以检查此 groupId 是否包含在security rules 中的用户声明中。

    您必须在每个文档中存储groupId,以便我们知道该文档属于哪个组。您可以尝试以下规则:

    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /collection/{docId} {
          allow read, write: if resource.data.groupId == request.auth.token.groupId;
        }
      }
    }
    

    只有当文档中的 groupId 与自定义声明中的 groupId 匹配时,上述规则才允许用户读取、写入文档。

    只能在安全环境中使用 Firebase Admin SDK 更改自定义声明,因此您可能必须使用云功能/服务器将用户添加到各自的组。

    【讨论】:

    • 这听起来很有希望...谢谢!我会试一试,如果成功的话,我会把它标记为答案
    • 有效!但相反,我将 request.auth.token.groupId 与路径中的 groupId 匹配。这是一个很好的解决方案。
    猜你喜欢
    • 2018-10-22
    • 1970-01-01
    • 2018-03-19
    • 2020-02-29
    • 2015-03-28
    • 1970-01-01
    • 2021-04-28
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多