这是用例:
任何人都可以注册使用该应用程序。身份验证由Firebase身份验证处理。
注册用户只能读写自己的详细信息。对数据库的访问由Firebase安全规则管理。例如:
{
"rules": {
".read" : "root.child('Admins').hasChild(auth.uid)",
".write" : "root.child('Admins').hasChild(auth.uid)",
"Companies": {
"$company" : {
".read" : "data.child('firebaseuid').val() === auth.uid",
".write" : "data.child('firebaseuid').val() === auth.uid",
"firebaseuid" : {
".write" : ???? ,
".read" : ????,
},
"details" : {
".read" : "data.parent().child('firebaseuid').val() === auth.uid",
".write": "data.parent().child('firebaseuid').val() === auth.uid",
},
},
},
}
问题:“ firebaseui”的适当安全规则是什么?
很显然,将读写属性设置为true不会。那是一个开放的数据库。
"firebaseuid" : {
".write" : true ,
".read" : true,
},
同样,:“ auth!== null”不起作用,因为它将允许任何注册用户读取/写入所有人的信息。
"firebaseuid" : {
".write" :"auth !== null" ,
".read" :"auth !== null",
},
将规则设置为仅允许注册用户读取/写入几乎可以执行。
"firebaseuid" : {
".read" : "data.parent().child('firebaseuid').val() === auth.uid",
".write": "data.parent().child('firebaseuid').val() === auth.uid",
}
几乎,因为这会遇到“首次写入”问题。也就是说,用户将无法在注册时初始化firebase uid(“ firebaseuid”),因为在第一种情况下,firebaseuid字段为null,从而导致安全规则返回false。
一个人可以在安全规则中添加一个firebase验证器,以便用户只有在该字段为空时才可以写入“ firebaseuid”。如果只有一个注册用户,这将很好地工作。但是,假设每个组织有多个管理员?在这种情况下,此解决方案将失败。
一个人可能想编写注册时触发的Firebase Cloud函数,但是Firebase用户类包含的信息不足。注册时,唯一可用的信息是通过电子邮件发送密码。
一个人可以编写由数据库创建或http put触发的更复杂的Cloud函数,但是我能想到的每种方法都有一个安全漏洞。
我意识到这肯定是一个非常普遍的问题,因此必须有一个简单的答案。有人能指出我正确的方向吗?
答案 0 :(得分:0)
通常,您将只允许用户将firebaseuid
设置为自己的UID,并且前提是该值当前没有值。所以:
"firebaseuid" : {
".write" : "!data.exists() && newData.val() === auth.uid"
},