代码之家  ›  专栏  ›  技术社区  ›  Antuan

文档中对象的安全规则

  •  0
  • Antuan  · 技术社区  · 6 年前

    我有以下收藏

    /用户

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

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

    我的应用程序逻辑如下:

    • 管理员只能向具有相同公司UID的其他用户授予管理员访问权限
    • 非管理员不能授予任何管理权限
    • 管理员不应删除自己的管理权限。

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

      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())
        }
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   Doug Stevenson    6 年前

    再简单不过了。您必须检查不应该更改的字段是否没有更改,这正是您在这里要做的。

    你可以用 MapDiff API 检查请求和资源之间保持不变的字段列表,但老实说,这并不会降低复杂性。