我正在构建一个应用程序,允许用户标记他们的工作时间。在我的应用程序中有两种类型的用户。其中一个是只具有读访问权的'employee‘,另一个是具有读写访问权限的'admin’。允许员工读取他们自己的工作时间,并且允许管理员为每个用户/雇员创建新用户或添加工作时间。
管理员填充表单并推送数据。在firebase上,我检查了用户是否经过身份验证,并对用户对象的每个属性运行了验证。但是我问自己,如果有人复制我的firebase url (源代码中可以看到),并试图将一些匿名对象或属性推送到我的数据库中,该怎么办?
例如,我有一个SignUp表单,它需要以下字段:
{
"users": {
"-KInd4V0V9k5n6yhAETd": {
"uid": "-KInd4V0V9k5n6yhAETd",
"username": "Haris",
"password": "HelloWolrd123",
"age": "21"
}
}
}在火边,我已经使用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上通过的。但是,我如何拒绝管理员不能添加'email‘属性并将其传递给我的防火墙数据库?因为数据库上的用户对象结构没有电子邮件属性。我不想让用户将自己的匿名对象/数据推送到我的数据库中。我是否需要验证每个属性,还是有一个方法可以验证对象本身?比如newData(‘用户’).isValid()?如果附加了一个属性,那么isValid返回false,因为对象在数据库结构中不一样?
发布于 2016-05-30 21:01:26
我不完全确定,但你认为你在寻找一条拒绝所有其他孩子的规则。如果这确实是你想要的,那么:
{
"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
}
}
}
}
}https://stackoverflow.com/questions/37533188
复制相似问题