使用异常字段为动态和静态节点创建Firebase规则

时间:2018-12-21 11:11:16

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

我有静态节点,例如(users-technical-services-orders),

例如(技术),我仅对同一技术创建(写限制),但允许对所有已通过身份验证的用户写入3个字段。

我可以这样:

    {
    "rules": {
     //
    "phonenumbers":{
    ".read": true,
    ".write":  "auth !== null"
    },
    "services":{
    ".read": true,
    ".write":  "auth !== null"
    },
    "subservices":{
    ".read": true,
   ".write":  "auth !== null"
    },
    "ChargeRecordsProv":{
    ".read": "auth !== null",
    ".write":  "auth !== null"
  },
    "ChargeRecordsUsers":{
    ".read": "auth !== null",
     ".write":  "auth !== null"
  },
    "ExchangeRecords":{
    ".read": "auth !== null",
    ".write":  "auth !== null"
  },
     "directions":{
    ".read": "auth !== null",
    ".write":  "auth !== null"
  },
     "orders":{
    ".read": "auth !== null",
     ".write":  "auth !== null"
  },
     "setting":{
    ".read": "auth !== null",
  },
     "technical":{
    ".read": "auth !== null",
      "$user_id": {
    ".write": "$user_id === auth.uid"
     },
     "balancepro": {
    ".write": "auth !== null"
     },
     "ratingNumClinets": {
    ".write": "auth !== null"
     },
     "ratingDegree": {
    ".write": "auth !== null"
     },
     "statusProv": {
    ".write": true
     }
  },
     "users":{
    ".read": "auth !== null",
      "$user_id": {
    ".write": "$user_id === auth.uid"
  }
  }
    }
  }

这对我的静态节点很有用。

问题是:

我有一个像(Technicians_Carpenter_location)这样的动态节点,他的名字不知道,因为它取决于管理员可以设置的内容。

这些动态节点将不允许使用我以前的规则进行读取或写入。  如果我添加这样的公共规则:

      ".read": "auth !== null",
      ".write":  "auth !== null"

可以读取和写入,但这将影响所有先前针对静态节点的规则,并且将不起作用。

所以,请提个建议,我该怎么办?

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找一个wildcard rule,它与所有其他规则未匹配的子节点匹配。这样的规则的一个简单示例是:

{
  "rules": {
    "profiles": {
      "$profileid": {
        ".read": true
      }
    }
  }
}

使用上述规则,任何人都可以读取特定的配置文件(例如/profiles/puf),但是任何人都不能一次读取所有配置文件(/profiles)。

因此,在您的情况下,如果要向特定的命名节点授予特定的权限,并向所有其他节点授予一组通用的权限,则可以将通配符添加到当前节点。像这样:

{
  "rules": {
    "phonenumbers":{
      ".read": true,
      ".write":  "auth !== null"
    },
    ...
    "$other": {
      ".read": "auth !== null",
      ".write":  "auth !== null"
    }
  }
}