google-cloud-firestore - 基于角色的 Firestore 规则
问题描述
我们需要在 firebase 规则中验证用户的角色。用户可以具有以下角色之一:SUPPORT、ADMIN、MODERATOR。
User 对象包含一个角色集合,因此我们可以将一些元数据放在相应的角色上: User Object
我试图在我的 firestore 规则中使用这个集合,但我还没有成功:
function getUserRoles(userId) {
return get(/databases/$(database)/documents/users/$(userId)/roles);
}
function hasRole(userId, role) {
return getUserRoles(userId) in role;
}
不幸的是,我无法在文档中找到如何检查角色列表是否包含请求role
作为文档 ID 的内容。
解决方案
get()
只能获取单个文档,而不是整个集合。所以,你现在正在尝试的是不可能的。另请记住,get()
每个请求最多只能包含 10 个文档。
考虑这样重写hasRole
,以检查用户的角色集合是否包含具有命名权限的文档:
function hasRole(userId, role) {
return exists(/databases/$(database)/documents/users/$(userId)/roles/$(role))
}
这假定role
是角色的字符串名称,例如“SUPPORT”。您必须为要检查的每个单独角色调用此函数。
如果您还需要检查文档的内容,则必须改为检查文档get()
的字段。
推荐阅读
- javascript - Firebase 如何检查除一个之外的所有子节点的更改?
- python - 检测 Python 程序何时退出或崩溃的好方法是什么?
- java - JNI - 从 C++ 调用 Java,找不到类
- mocha.js - 如果测试在 before/bforeEach 钩子中失败,是否可以保证不会启动以下测试?
- algorithm - 在三角形网格上画一条线的算法
- javascript - TypeError:无法在 Class.run 中读取属性“config”的 null ~/node_modules/angular-cli/tasks/serve.js:22:61
- html - 在 MeteorJS / Blaze 上创建动态标签的更有效方法是什么?
- ansible - 从 ansible 生成手动安装指南
- angular - 为什么测试断言到订阅通过而不在异步区域中?
- jenkins - 本地文件系统上的詹金斯提交触发器