Firebase数据库规则中的通配符

时间:2016-12-15 09:36:32

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

我们可以在Firebase数据库规则中使用通配符吗?从我的实验来看,情况似乎并非如此。我错过了什么或是应该发生什么?

因此,例如,我可能对所有products_*条目具有相同的规则,并且使用通配符将它们组合在一起会更容易。

为了澄清,它是一个Web应用程序,我关心我们在控制台中设置的数据库权限。我们可以在那里使用通配符吗?

例如,

{
"rules": {
    "products_A": {
        <rules>
    },
    "products_B": {
        <rules>
    }
}

我想只有一套规则,如:

{
"rules": {
    "products_*": {
        <rules>
    }
}

感谢。

1 个答案:

答案 0 :(得分:9)

Firebase提供了用于表示ID和动态子键的通配符路径。例如,以下规则中的$ uid是一个“通配符”,允许该节点内的参数引用父节点。

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

在上面的示例中,$ uid是/ users节点中每个用户节点的通配符路径。以下是上述规则如何扩展每个节点

users
  uid_0 <--------|
                 V
    ".write": "uid_0 === auth.uid" //only user with uid = uid_0 can write
  uid_1
    ".write": "uid_1 === auth.uid" //only user with uid = uid_1 can write
  uid_2
    ".write": "uid_2 === auth.uid" //only user with uid = uid_1 can write

您可以对此进行扩展,以提供极大的灵活性。假设您希望某组用户能够访问组节点。小组规则可以是

  "rules": {
    "Groups": {
       "$group_id" : {
         ".read": "root.child('Allowed_Users/' + auth.uid).val() === $group_id",
         ".write": "root.child('Allowed_Users/' + auth.uid).val() === $group_id"
       }
    }

这限制了对Allowed_Users节点中指定的某组用户的每个组节点的访问。 Firebase数据库中的数据可能如下所示:

Groups
   group_0
     //data
   group_1
     //data


Allowed_Users
   uid_0: group_0
   uid_1: group_0

这个例子,用户uid_0和uid_1可以读/写group_0但不能读/写group_1