我正在构建一个允许用户标记其工作时间的应用程序。在我的应用程序是2种类型的用户。其中一个是“员工”,它只具有读访问权限,另一个是具有读写权限的“管理员”。允许员工阅读自己的工作时间,并允许管理员为每个用户/员工创建新用户或添加工作时间。
管理员填写表单并推送数据。在firebase上,我检查了用户是否经过身份验证,并为用户对象的每个属性运行了验证。但是我问自己,如果有人复制我的firebase url(在源代码中可见)并尝试将一些匿名对象或属性推送到我的数据库,该怎么办?
例如,我的SignUp表单需要以下字段:
{
"users": {
"-KInd4V0V9k5n6yhAETd": {
"uid": "-KInd4V0V9k5n6yhAETd",
"username": "Haris",
"password": "HelloWolrd123",
"age": "21"
}
}
}
在firebas方面,我已经使用newData方法检查子项是否从表单传递:
".validate": "newData.hasChildren(['uid','username','password,'age'])"
我已经运行了每个属性的验证,检查数据是否有效,如username.isString()等。
那么,如果管理员将这样的开发者工具用户对象推送到我的数据库(已添加电子邮件属性)
,该怎么办? {
"-KInd4V0VEEEEEEEE": {
"uid": "-KInd4V0VEEEEEEEE",
"username": "Haris",
"password": "HelloWolrd123",
"age": "21",
// anonymous Object pushed from n admin developer-console
"email": "anonymous@object.com"
}
}
这将起作用,因为所有必填字段都有效并且验证在firebase上传递。但是,如何拒绝管理员无法添加并将“电子邮件”属性传递到我的firebase数据库?因为我的数据库上的用户对象结构没有电子邮件属性。我不想让用户可以将他自己的匿名对象/数据推送到我的数据库。我是否需要验证每个属性,或者是否有可以验证Object本身的方法?像newData('users')。isValid()?如果属性是append,则isValid返回false,因为该对象与数据库结构中的对象不同?
答案 0 :(得分:2)
我不完全确定,但认为您正在寻找拒绝所有其他孩子的规则。如果这确实是您正在寻找的,那么:
{
"rules": {
"users": {
"$uid": {
// Valid users have these properties
".validate": "newData.hasChildren(['uid','username','password,'age'])",
// The uid property must be a string and refer to an existing noder under /users
"uid": {
".validate": "newData.isString() && root.child('users').child(newData.val()).exists()"
},
// the user name must be a string
"username: {
".validate": "newData.isString()"
},
"password: {
// I really hope you're not storing a password
},
"age: {
// TODO: you're storing age as a string now, might want to fix that
".validate": "newData.isNumber()"
},
// All other properties are rejected
"$other": {
".validate": false
}
}
}
}
}