firebase - 如何通过规则为特定用户授予对多个 Firestore 文档的访问权限
问题描述
我想为特定用户组授予对特定文档的访问权限。如下图所示。我想为用户集合中的usergrp1授予对Doc1和Doc3的访问权限。如何使用 Firestore 规则来做到这一点。
文件收集
带有组文档的用户集合
解决方案
为了访问给定文档的安全规则中的其他 Firestore 文档,您应该使用get()
和exists()
函数,如文档中所述。
但是,如果您将组的每个用户保存在“组”文档的特定字段中(如我们在屏幕截图中所见),您会遇到一些困难,因为您需要知道要检查哪个字段。
我建议这样做:对于属于组的每个用户,使用用户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
}
}
}
推荐阅读
- mysql - 派生表不存在 - mySQL 错误 1146 (42S02)
- c - 在 C 中使用 GnuTLS 生成 RSA 密钥对
- testing - 健全性测试用例编写
- python - Python请求超时无法正常工作
- python - 加载带有 raw_unicode_escape 编码字符串的 JSON
- c - __WFI() 不会休眠,即使所有中断都被禁用和挂起清除 - LPC18XX 系列
- java - 在 getInstance() 方法或实例变量定义中初始化单例之间是否存在功能差异
- java - 计数二叉搜索树中小于键的节点数
- c# - 尝试按顺序打印链的所有节点时控制台冻结
- twitter-oauth - oAuth 1.0,高级 Rest 客户端,Twitter API,不工作