在Firebase中共享客户端

时间:2013-09-16 05:05:19

标签: firebase firebase-security

我想知道是否可以实现Firebase安全性,以便允许我的应用的每个用户完全访问他们自己位置的数据,同时让用户自己启用或禁用该类型从其他用户访问他们自己的数据?或者基本上,是否可以在我的应用程序的用户中实施简单的共享,Dropbox或Google Drive样式,以便严格执行?

1 个答案:

答案 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获得一些嵌套功能。

相关问题