【发布时间】:2019-01-20 13:18:49
【问题描述】:
这是用例:
任何人都可以注册使用该应用程序。身份验证由 Firebase Auth 处理。
-
注册用户只能读取和写入自己的详细信息。对数据库的访问由 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 字段为空,导致安全规则返回 false。
可以将 firebase 验证器添加到安全规则中,以便用户在且仅当字段为空白时才写入“firebaseuid”。如果只有一个注册用户,这就足够了。但是假设每个组织有多个管理员?在这种情况下,此解决方案将失败。
可能想编写一个在注册时触发的 Firebase Cloud 函数,但 Firebase 用户类不包含足够的信息。在注册时,唯一可用的信息是电子邮件密码。
可以编写一个由数据库创建或 http put 触发的更复杂的云函数,但我能想到的每种方法都有一个安全漏洞。
我意识到这一定是一个非常普遍的问题,所以必须有一个简单的答案。有人可以指出我正确的方向吗?
【问题讨论】:
-
不确定我理解正确。
"firebaseuid"属性是否意味着将创建该公司的用户的 UID 作为其值? -
如果您描述您想要拥有的用例,而不是您认为不起作用的所有选项,这可能会更容易理解。 IE。 “我的应用允许用户注册公司。注册公司的用户会自动成为该公司数据的管理员。公司的现有所有者可以向该公司添加新所有者。”
-
弗兰克,是的,“firebaseuid”意味着拥有用户的 UID。这将启用此安全规则:“data.parent().child('firebaseuid').val() === auth.uid”,这与此处提出的建议一致:youtube.com/watch?v=PUBnlbjZFAI&t=1213s(时间 18:41)。
-
Frank,具体用例:我的 firebase 数据库中有一家公司,没有注册管理员。数据库中有一个表,其中包含预先批准的管理员的只读列表。预先批准的管理员 1) 使用 Firebase 身份验证进行注册,2) 应用程序在预先批准的表中查找电子邮件地址,3) 如果电子邮件匹配并且电子邮件经过验证,则注册完成。问题:Company/$company/details 的安全规则是什么?谢谢。
-
@RichardZ pre-approved table 和 Company/$company/details 是 2 个不同的表,对吗?
标签: firebase-realtime-database firebase-authentication firebase-security