复杂的Firebase安全规则

时间:2017-03-16 06:54:35

标签: firebase firebase-realtime-database firebase-security

我的Firebase数据结构类似于

-isAdmin 
    -user1
        isAdmin: true

-users
    -user1 
        -firsName: Jane
        -lastLoggedIn: 12 March 2017
    -user2
        -firstName: John
        -lastLoggedIn: 11 March 2017

我希望我的管理员(用户1)能够执行以下操作

向-users分支添加更多用户。所以我需要以下权限(创建user3,user4 ......等)

"users": {
    .write: "(auth != null) && (root.child('isAdmin').child(auth.id).val == true)
}

但是我也希望非管理员用户能够更新lastLoggedIn Entry。所以我需要以下许可

"users": {
    $userId: {
        "lastLoggedIn": {
            .write: "(auth != null) && ($userId == auth.id)   
        }
    }
}

这是问题,firebase不允许嵌套规则,因为我在用户下有.write规则,用户/ $ userId / lastLoggedIn下的.write规则将被忽略我相信

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:2)

Firebase安全规则不允许嵌套规则 - 他们确实如此。规则级联和您需要注意的情况是,一旦授予权限,就不能通过“嵌套”规则撤销它。

因此,如果更高的规则已经授予了写入权限,则只会忽略“嵌套”规则。如果尚未授予写入权限且“嵌套”规则授予写入权限,则不会忽略该权限。

遵守这些规则:

"users": {
  ".write": "(auth != null) && (root.child('isAdmin').child(auth.uid).val == true),
  "$userId": {
    "lastLoggedIn": {
      ".write": "(auth != null) && ($userId == auth.uid)
    }
  }
}

管理员和用户自己都可以写信给lastLoggedIn