如何使用Firebase安全规则验证此数据结构



到目前为止没有Firebase安全规则运气。

我有这个

{
    "rules": {
       "users": {
          "$user_id": {
            ".read": true,
            ".write": "auth !== null && auth.uid === $user_id",
            "profile": {
               ".validate": "newData.hasChildren(['first_name', 'last_name'])"
            }
         }
      }
    }
}

我发送数据和配置文件,其中一个是空白的...它可以以任何方式写入。我结束了这样的数据...

{
  "users" : {
    "simplelogin:25" : {
       "profile" : {
          "first_name" : "John",
          "last_name" : ""
       }
  },
    "simplelogin:26" : {
      "profile" : {
        "first_name" : "Bob",
        "last_name" : ""
      }
    }
  }
}

关于如何使上述规则起作用的任何帮助?似乎无法正确验证它。

您的验证规则是:

".validate": "newData.hasChildren(['first_name', 'last_name'])"

因此,如果新数据具有first_namelast_name属性,则有效。

您正在发送此对象:

"profile" : {
  "first_name" : "John",
  "last_name" : ""
}

此对象具有first_namelast_name属性,因此根据您的规则有效。

您似乎想要想要 是属性不仅存在,而且是字符串,并且具有最小的长度。如果确实是您的要求,则可以将其写入验证规则:

"profile": {
   ".validate": "newData.hasChildren(['first_name', 'last_name'])",
   "first_name": {
       ".validate": "newData.isString() && newData.val().length >= 10"
   },
   "last_name": {
       ".validate": "newData.isString() && newData.val().length >= 10"
   }
}

第一个.validate确保配置文件具有(至少)first_namelast_name属性。其他.validate规则确保它们具有正确的类型和最小长度。

最新更新