Firebase针对不同孩子的不同安全规则

时间:2019-08-26 16:39:36

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

我有这样的数据结构。

enter image description here

我希望,只有管理员可以创建新用户, 只有管​​理员可以写expireDate, 管理员和用户都可以编写其他两个字段,

我尝试了以下dabase规则:

{
  "rules": {

      "users":{

              "$uid": {

                ".read": "auth.uid == $uid || root.child('admins').child(auth.uid).exists()",

                "expireDate":{
                                        ".write": "root.child('admins').child(auth.uid).exists()"
                },

                "firstLoginAttempt":{
                    ".write": "auth.uid == $uid || root.child('admins').child(auth.uid).exists()"
                },

                  "macAddress":{
                    ".write": "auth.uid == $uid || root.child('admins').child(auth.uid).exists()"
                }


      } 
      }

我允许管理员为所有子代写,但管理员无法创建新用户。我知道Firebase数据库规则会在级联中覆盖,但是如何在此处实现。

1 个答案:

答案 0 :(得分:1)

在JSON树的某个级别授予用户(读或写)访问权限后,您将无法再在树的更低级别取消该权限。

这意味着:

  1. 更多人可以写入的数据应该位于JSON树的较低级别。
  2. 或者您将需要根据需求访问级别将数据放在不同的顶层注释中。

由于您的数据结构未遵循#1的指导,因此,您应遵循#2。

类似的东西:

users: {
  user1: { ... },
  user2: { ... }
expiries
  user1: { ... },
  user2: { ... }

然后使用以下命令保护这两个顶级节点之间的访问:

{
  "rules": {
    "users":{
      "$uid": {
        ".read": "auth.uid == $uid || root.child('admins').child(auth.uid).exists()",
    },
    "expiries":{
      "$uid": {
        ".read": "root.child('admins').child(auth.uid).exists()",
    }
  } 
}