Firebase存储安全规则和Firestore

时间:2020-03-22 15:12:25

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

我在Firestore中有“组”。每个组都有一个“成员”键。我的目标是编写Firebase存储安全规则,以仅允许“写入”组中的成员:

# I want something like this
match /groups/{groupId} {
  allow read, write: if request.auth.uid in get(/database/groups/{groupId}/members);
}

1 个答案:

答案 0 :(得分:1)

安全规则无法从其他服务读取,因此您将无法以此处描述的方式实现组。取而代之的是,您必须在规则本身或用户的ID令牌(作为自定义声明)中对某人所属的组进行编码。

嵌入用户令牌中的组成员身份

有关后者的示例,请参见making data "group private"上Firebase文档中的以下片段:

另一个同样常见的用例是允许对一个对象进行组权限,例如允许多个团队成员就共享文档进行协作。有几种方法可以做到这一点:

  • 修改Firebase身份验证自定义令牌,其中包含有关组成员的其他信息(例如组ID)

  • 在文件元数据中包含组信息(例如组ID或授权uid列表)

一旦此数据存储在令牌或文件元数据中,就可以从规则中对其进行引用:

// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/{groupId}/{fileName} {
  allow read: if resource.metadata.owner == request.auth.token.groupId;
  allow write: if request.auth.token.groupId == groupId;
}

这些天,您无需铸造完整的自定义令牌即可包含组ID,但是您可以include information in a regular token as a custom claim通过Firebase Admin SDK。例如,在Node.js中,您可以添加一个groupId,如上面的用于:

admin.auth().setCustomUserClaims(uid, {groupId: "group"})

这种方法在您可以清楚地标识出用户所属的单个组(或一组小的组)的情况下效果很好。如果您拥有包含和排除在内的大型组成员资格层次结构,则很难将它们捕获到声明中,尤其是所有声明必须少于1,000个字节。

加入规则中的组成员身份

另一种方法是将有关组成员身份的知识嵌入规则本身。在这种情况下,您将采用数据库中已有的结构,并将其编码为规则。

在您的组成员资格相当稳定的情况下,您可以手动执行此操作。在这种情况下,您最终将在安全规则中使用硬编码的UID。

但是,由于您选择将组成员身份存储在数据库中,因此这些成员身份可能至少有些动态。在这种情况下,您可能需要结合使用以前的方法来捕获部分成员身份,然后生成其他部分的安全规则。

然后,您可以定期或在组成员身份更改时部署生成的规则。

尽管这是比(仅)将信息嵌入用户令牌中更强力的方法,但我已经看到它已用于创建高级成员资格测试。我最不喜欢的是,生成的安全规则往往变得不可读。您可以通过在规则中的单独功能中生成“组检查”来减轻这种情况,以便手写规则(您将更经常阅读)可以仅包含对isMemberOfValidGroup(...)的调用或类似的调用那个。

相关问题