用于实施高级RBAC应用程序的Firestore规则和客户端查询

时间:2019-09-14 05:23:08

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

正在努力寻找具有许多用户角色的应用的Firestore结构的有效示例。

应用程序用户角色

Super Admin

--------------- Companies level
Owners
Accountants
Managers
Developers
--------------- Companies level

Visitors

公司开发产品,每个产品可以有多个开发人员和一个经理。
管理员可以创建和删除他们的产品,开发人员只能读取和更新他们所属的产品。
会计只能读取公司内部的所有产品。所有者是他公司的管理员。

我试图将职位存储在/products/{product}/owners/{owner}之类的子集合中。
但是无法用子集合客户端正确查询这种结构。

最终我能够以例如所有者存储在Firestore地图中(模拟器不允许该数组):

Firebase安全规则

match /products/{product} {
  function isOwner() {
    return resource.data.owners[request.auth.uid];
    // below are OK for Simulator but can't be queried using .where() client-side
    // return exists(/databases/$(database)/documents/products/$(product)/owners/$(request.auth.uid));
    // return get(/databases/$(database)/documents/products/$(product)/owners/$(request.auth.uid)).data != null;
  }
  ...
  allow get, list: if isOwner() || isAccountant() || isManager() || isDeveloper();
  allow update: if isOwner() || isManager() || isDeveloper();
  allow create: if isOwner() || isManager();
  allow delete: if isOwner();
}

客户端Javascript

firestore
  .collection('products')
  .where(`owners.${user}`, '==', true)
  .limit(5)
  // .orderBy('created', 'desc') // Also was unable to sort it by another field, why is it so?
  .onSnapshot(snap => snap.forEach(e => console.log(e)));

在产品内部存储所有者,会计师,经理,开发人员似乎是一个好主意,但我找不到任何证明或证明这种结构的参考。同样,.where()查询也不支持地图类型,这也是非常可疑的。

请提供有关如何在类似应用程序中处理多层RBAC的建议?!

0 个答案:

没有答案