我想知道是否可以通过以下方式实现Firebase安全性:允许我的应用程序的每个用户完全访问自己位置的数据,同时使该用户能够自行启用或禁用来自以下位置的访问类型其他用户自己的数据?或者基本上,是否可以通过严格执行这种方式在我的应用程序用户之间实现简单的共享,Dropbox或Google云端硬盘风格?
由于Firebase安全规则允许您引用Firebase中的数据,因此您可以将安全规则基于可以为其创建数据的任何内容。所以是的,您可以允许用户以几乎任何可以计划的方式共享他们自己的数据。
为了创建一个基于Dropbox想法的简化示例,我可以在数据下创建一个“共享”文件夹,并在其中存储一个访问权限的安全文件夹:
/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获得一些嵌套功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句