3

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

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

但是,Firebase 规则tenantId中似乎没有 其他相关的身份验证字段(例如 、、等)。uidemailemail_verified

一种选择似乎是使用SDKtenantId作为自定义声明单独添加。firebase-admin但这会在用户对象上创建重复信息:

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

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

是否有其他方法可以访问tenantIdFirestore 规则和/或使用多租户 Firestore 的替代最佳实践?

4

2 回答 2

5

沿着自定义声明路线走下去,我发现租户 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);
}
于 2021-01-13T19:35:23.317 回答
2

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

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

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

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

于 2020-08-06T20:42:26.383 回答