文档中对象的安全规则

时间:2020-07-24 01:51:42

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

我有以下收藏

/公司

/用户

在用户文档中,我有一个companyUuid来引用其公司成员身份,还有一个名为Permission的对象,该对象具有两个属性:

{ 
  admin : true|false
  superAdmin: true | false
}

我的应用程序逻辑如下:

  • 超级管理员可以执行任何操作,包括向其他用户授予超级管理员或管理员权限
  • 管理员只能向具有相同companyUuid的其他用户授予管理员访问权限
  • 非管理员不能授予任何管理员权限
  • 管理员不应删除自己的管理员权限。

我的担心是,鉴于我将权限存储在用户文档中,如何有效地防止非管理员写入他们的权限对象,同时还允许他们编辑用户文档中的字段?

我这里有一些代码,我认为它看起来太复杂了,必须有一种更简单的方法。如果您指出正确的方向,我将不胜感激:

  match /users/{userUuid} { 

      allow read: if request.auth != null && belongsToSameCompany()

      function areAdminPermissionsIntact(){
        return request.resource.permissions.admin == resource.permissions.admin
      }

      function areSuperAdminPermissionsIntact(){
        return request.resource.permissions.superAdmin == resource.permissions.superAdmin
      }

      function isNotTheSameUser(){
        return resource.data.uuid != request.auth.uid
      }

       function belongsToSameCompany(){
        return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.companyUuid == resource.data.companyUuid    
      }

      allow write: if request.auth != null 
        && 
       (areAdminPermissionsIntact() || areAdminPermissionsIntact() == false && resource.data.permissions.admin == true && isNotTheSameUser() && belongsToSameCompany()) 
        &&    
       (areSuperAdminPermissionsIntact() || areSuperAdminPermissionsIntact() == false && resource.data.permissions.superAdmin == true && isNotTheSameUser() && belongsToSameCompany())
    }

1 个答案:

答案 0 :(得分:1)

没有比这更简单的了。您必须检查不应更改的字段是否没有更改,而这正是您在这里所做的。

您可以使用MapDiff API来检查请求和资源之间未更改的字段列表,这有点不同,但是说实话,这不会使事情变得那么简单。