我想知道是否可以实现Firebase安全性,以便允许我的应用的每个用户完全访问他们自己位置的数据,同时让用户自己启用或禁用该类型从其他用户访问他们自己的数据?或者基本上,是否可以在我的应用程序的用户中实施简单的共享,Dropbox或Google Drive样式,以便严格执行?
答案 0 :(得分:4)
由于Firebase security rules允许您引用Firebase中的数据,因此您可以将安全规则建立在可以为其创建数据的任何内容上。所以,是的,您可以允许用户以您可以设计的任何方式共享他们自己的数据。
为了设计一个基于Dropbox构思的简化示例,我可以在我的数据下有一个“shares”文件夹,以及一个存储访问权限的安全文件夹:
/security/$user_id/$friend/... // where I put the access rights
/folders/$user_id/shares/... // where I put the shared files
现在,我可以通过将用户名和他们可以访问的文件夹列表放入我的Firebase数据来控制对它的访问:
/security/$user_id/$friend_id = /never/gonna/give/you/up = true
现在在我的安全规则中,我可以这样写:
{
"security": {
"$user_id": { // only authenticated user may read/write his rules
"shares": {
".read": "auth.id === $user_id",
".write": "auth.id === $user_id"
}
}
}
"folders": {
"$user_id": {
// only authenticated user may read/write his folders
".read": "auth.id === $user_id",
".write": "auth.id === $user_id",
"shares": {
// but my friends can read data in shares
".read": "root.child('security/'+$user_id+'/'+auth.id+'/shares').val() === true"
}
}
}
}
请注意,对此(暂时)的一个限制是安全规则无法以递归方式或以任何嵌套方式工作。但是,由于规则是允许的(如果路径的任何父级允许访问,则允许访问),您可以解决此问题。
您可能需要对子路径的最大数量设置硬限制,并在规则中手动声明它们,如下所示:
// allow sharing up to 3 levels deep
"shares": {
".read": "root.child('security/'+$user_id+'/'+auth.id+'/shares').val() === true",
"$child1": {
".read": "root.child('security/'+$user_id+'/'+auth.id+'/shares/'+$child1).val() === true",
"$child2": {
".read": "root.child('security/'+$user_id+'/'+auth.id+'/shares/'+$child1+'/'+$child2).val() === true",
"$child3": {
".read": "root.child('security/'+$user_id+'/'+auth.id+'/shares/'+$child1+'/'+$child2+'/'+$child3).val() === true",
}
}
}
}
不是最漂亮的东西,而是一个很好的临时解决方案,直到Firebase获得一些嵌套功能。