【问题标题】:Data Structure and security on Firebase for Multiple authority layersFirebase 上用于多个权限层的数据结构和安全性
【发布时间】:2020-07-23 13:46:04
【问题描述】:

我目前正在 Firebase 服务上设计一个应用 (SaaS)。 此应用有我们可以归类为的用户

  1. 超级管理员 - 无所不能
  2. 管理员 - 通常是 HR 人员,他们可以创建用户(员工)并通过后端应用程序分配权限。管理员本身就是员工。
  3. 员工 - 使用前端并具有有限的权限,例如读取某些集合 这些角色通过 FireAuth 定义为声明。

这个应用程序被不同的公司使用。每个人都有自己的管理员和员工。

我面临的挑战是如何构建我的数据,使管理员只是其公司的管理员,而员工只能访问其公司内的数据。

当然是在 Firestore 规则方面。 我尝试了这种方法

match companies/{companyId} {
   allow read, write: request.auth.uid != null && request.auth.token.admin == true;
}

但这意味着来自另一家公司的任何管理员都可能对另一家公司进行读写。

另一种方法是

match companies/{companyId} {
   allow read: request.auth.uid != null;
   allow write: request.auth.token.admin == true && request.auth.uid = 'someIdOfAnAdminFromCompanyId'
}

但这意味着只要用户成为管理员,就必须更新规则。

最安全的方法是为公司集合中的每个项目创建自定义声明,并将该角色分配给每个公司的管理员。但随后 you can only create 1000 bytes customClaims 下的数据。

这同样适用于应该只能在其公司的某些子集合上读写的员工。

任何建议都会非常有帮助。 谢谢

【问题讨论】:

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


    【解决方案1】:

    为什么不将每个公司的管理员存储在他们自己的集合中:

    match companies/{companyId} {
       allow read, write: request.auth.uid != null
         && exists(/databases/$(database)/documents/companies/$(companyId)/admins/$(request.auth.uid));
      
       match admins/{uid} {
         allow get: if request.auth.uid == uid;
         allow read, write: if request.auth.uid != null && request.auth.token.superadmin == true;
       }
    }
    

    【讨论】:

    • 很好,我不知道存在函数。让我试试,如果效果很好,我会接受答案
    猜你喜欢
    • 2014-11-10
    • 2016-03-12
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多