【发布时间】:2021-01-08 06:56:18
【问题描述】:
我想授予特定用户组对特定文档的访问权限。如下图所示。我想为 users 集合中的 usergrp1 授予对 Doc1 和 Doc3 的访问权限。如何使用 Firestore 规则。
文档集合
带有组文档的用户集合
【问题讨论】:
标签: firebase google-cloud-firestore firebase-authentication firebase-security
我想授予特定用户组对特定文档的访问权限。如下图所示。我想为 users 集合中的 usergrp1 授予对 Doc1 和 Doc3 的访问权限。如何使用 Firestore 规则。
文档集合
带有组文档的用户集合
【问题讨论】:
标签: firebase google-cloud-firestore firebase-authentication firebase-security
要访问给定文档的安全规则中的其他 Firestore 文档,您应该使用 get() 和 exists() 函数,如 doc 中所述。
但是,如果您将组的每个用户保存在“组”文档的特定字段中(正如我们在屏幕截图中看到的那样),您会遇到一些困难,因为您需要知道要检查哪个字段。
我建议执行以下操作:对于属于组的每个用户,使用用户 uid 作为字段名称并分配一个虚拟值(例如 true)。然后您可以轻松检查文档中是否存在该字段,例如,使用in 运算符和get() 函数:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /docs/{docId} {
allow read: if request.auth != null && request.auth.uid in get(/databases/$(database)/documents/users/usergrp1).data
}
}
}
但是,在上面的规则中可以看到有一个问题:组名是硬编码的……
为了让docs集合中的每个特定文档都有一个组值(例如doc1可以被usergrp1的用户读取),您需要在文档中保存可以访问它的组。
如果您将组名保存在名为 authorizedGroup 的字段中,则可以通过第二次使用 get() 函数来调整规则如下:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /docs/{docs} {
allow read: if request.auth != null && request.auth.uid in get(/databases/$(database)/documents/users/$(get(/databases/$(database)/documents/docs/$(docs)).data.authorizedGroup)).data
}
}
}
【讨论】: