【问题标题】:Firestore Rules with multi-tenancy?多租户的 Firestore 规则?
【发布时间】:2020-11-27 04:17:55
【问题描述】:

Firebase Rules docs 建议构建条件,将经过身份验证的用户的令牌(即request.auth)与目标 Firestore 文档进行比较。比如:

match /posts/{postId} {
  allow read, write: if (request.auth.uid != null) && 
    (resource.data.tenantId == request.auth.token.tenantId);
}

但是,tenantId 与其他相关的身份验证字段(例如,uidemailemail_verified 等)一样,在 Firebase Rules 中似乎不可用。

一个选项似乎是使用firebase-admin SDK 将tenantId 单独添加为custom claim。但这会在用户对象上创建重复信息:

{
  uid: 'nzjNp3QIfSR6uWy',
  emailVerified: true,
  displayName: 'pickleR'
  ...
  tenantId: 'wubalubadubdub',
  customClaims: { tenantId: 'wubalubadubdub' },
}

alternative option 似乎是在 Firestore 中创建 tenants 集合。但是,这种方法似乎引入了不必要的复杂性并增加了所需的 Firestore 查询数。

是否有替代方法可以访问 Firestore 规则中的 tenantId 和/或使用多租户 Firestore 的替代最佳做法?

【问题讨论】:

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


    【解决方案1】:

    通过自定义声明路线后,我发现租户 ID 已作为 'request.auth.token.firebase.tenant' 存储在嵌套对象中

    在您的示例中,规则是:

    match /posts/{postId} {
      allow read, write: if (request.auth.uid != null) && 
        (resource.data.tenantId == request.auth.token.firebase.tenant);
    }
    

    【讨论】:

      【解决方案2】:

      您描述的两个选项是惯用的:

      1. 将信息作为自定义声明的 ID 令牌的一部分传递到规则中。
      2. request.auth.uid的规则中查找数据库中的信息。

      这两者都不总是比另一个更好:自定义声明更方便和可读,而使用数据库通常更快。通常使用数据库查找来查找更不稳定的信息,并使用声明来查找“一次”的信息。

      由于这是针对不太可能快速更改的租户 ID,因此我可能会选择自定义声明。

      【讨论】:

        猜你喜欢
        • 2018-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-18
        相关资源
        最近更新 更多