组的Firebase数据库规则

jue*_*n d 3 json firebase firebase-security firebase-realtime-database

我有此Firebase数据库,如有必要可以更改:

D B

该数据库的JSON是:

{
  "groups": {
    "1": {
      "name": "G1",

      "points": {
        "1": {
            "name": "p1"
        }
      },
      "visits": {
        "1": {
            "name": "v1"
        }
      },
      "areas": {
        "1": {
            "name": "a1"
        }
      },
      "waypoints": {
        "1": {
            "name": "w1"
        }
      },
      "interests": {
        "1": {
            "name": "i1"
        }
      }
    },
    "2": {
      "name": "G2",

      "points": {
        "2": {
            "name": "p2"
        }
      },
      "visits": {
        "2": {
            "name": "v2"
        }
      },
      "areas": {
        "2": {
            "name": "a2"
        }
      },
      "waypoints": {
        "2": {
            "name": "w2"
        }
      },
      "interests": {
        "2": {
            "name": "i2"
        }
      }
    }
  },
  "users": {
    "qdRw1khg1ZO1s52YioYCdM4WrD02": {
      "firstName": "AAAA",
      "lastName": "BBB",
      "email": "sdf@sdfs.com"     
    },
    "h3KYDXkPQrY246w6Y6NXIanVoNS2": {
      "firstName": "FF",
      "lastName": "RR",
      "email": "wwf@jjuzhz.com"
    }
  },
  "userGroups": {
    "qdRw1khg1ZO1s52YioYCdM4WrD02": {
      "1": "admin",
      "2": "readwrite"
    },
    "h3KYDXkPQrY246w6Y6NXIanVoNS2": {
      "1": "admin",
      "2": "readonly"     
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想定义规则来完成以下任务:

  • 每个人都可以创建一个新组
  • 仅群组用户可以读取群组数据
  • 群组的“管理员”只能向群组本身写入数据,添加用户并更改群组数据的子级别,但是
    • “ readwrite”组用户可以写入“点”和“访问”子级别
    • “只读”组用户根本无法写

我有:

"groups": {          
  "$groupId": {
    ".read": "root.child('userGroups').child(auth.uid).child($groupId).exists()",
    ".write": "! root.child('userGroups').child(auth.uid).child($groupId).exists() || 
                          (data.parent().val() === 'points' && root.child('userGroups').child(auth.uid).child($groupId).val() != 'readonly') ||
                        (data.parent().val() === 'visits' && root.child('userGroups').child(auth.uid).child($groupId).val() === 'readonly') ||
                        (data.parent().val() != 'points' && data.parent().val() != 'visits' && root.child('userGroups').child(auth.uid).child($groupId).val() === 'admin')"
  }
},
"users": {
  "$userId": {
    ".read": "auth != null",
    ".write": "auth != null && 
              $userId === auth.uid && 
              newData.val() != null"
  }
},
"userGroups": {
  "$userId": {
    ".read": "auth != null",
    ".write": "auth != null && 
               data.child(auth.uid).val() === 'admin' && 
               newData.val() != null"          
  }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为

data.parent().val()
Run Code Online (Sandbox Code Playgroud)

不返回父母的名字字符串。所以我做不到

data.parent().val() != 'points'
Run Code Online (Sandbox Code Playgroud)

如何解决呢?问题是根据指定的规则将数据写入组。

Fra*_*len 5

Firebaser在这里。我希望这个答案会随着我的更新而更新。

我的第一步是将特定子节点的规则移至该特定子节点。这消除了parent()您遇到的问题。第一次迭代是:

  "groups": {          
    "$groupId": {
      ".read": "root.child('userGroups').child(auth.uid).child($groupId).exists()",
      "points": {
        ".write": "root.child('userGroups').child(auth.uid).child($groupId).val() !== 'readonly'"
      }
    }
  },
Run Code Online (Sandbox Code Playgroud)

这允许用户h3KYDXkPQrY246w6Y6NXIanVoNS2写入/groups/1/points(用户是管理员),但不能写入/groups/2/points(用户仅具有只读访问权限)。

下一步是使规则更通用。为此,我引入了一个$child变量,该变量与组下的任何节点匹配:

  "groups": {          
    "$groupId": {
      ".read": "root.child('userGroups').child(auth.uid).child($groupId).exists()",
      "$child": {
        ".write": "root.child('userGroups').child(auth.uid).child($groupId).val() !== 'readonly'
                   || ($child !== 'points' && $child !== 'visits')"
      }
    }
Run Code Online (Sandbox Code Playgroud)

这允许用户h3KYDXkPQrY246w6Y6NXIanVoNS2写入/groups/2/name(任何组成员都可以写入),但不能写入/groups/2/points(用户仅具有只读访问权限)。

更新:显然我在上面颠倒了您的逻辑,所以这是我的最终看法:

  "groups": {          
    "$groupId": {
      ".read": "root.child('userGroups').child(auth.uid).child($groupId).exists()",
      ".write": "root.child('userGroups').child(auth.uid).child($groupId).val() == 'admin'",
      "$child": {
        ".write": "root.child('userGroups').child(auth.uid).child($groupId).val() === 'readwrite'
                   && ($child !== 'points' || $child !== 'visits')"
      }
    }
Run Code Online (Sandbox Code Playgroud)

与这个用户h3KYDXkPQrY246w6Y6NXIanVoNS2

  • 可以写信,/groups/1/name因为他们是第1组的管理员
  • 可以写信,/groups/2/points因为他们是第1组的管理员
  • 无法写信,/groups/2/name因为他们不是第2组的管理员
  • 可以写入,/groups/2/points因为它们是第2组的可读写成员