2016-08-31 94 views
2

我的存储目录中有一个名为users-projects的主“文件夹”,然后为每个用户的项目创建文件夹。我希望允许用户只访问他们的项目和他们被邀请的项目,比如带有协作者的Dropbox或Google云端硬盘文件夹。允许Firebase存储桶只能被某些用户访问

在文档,他们说:

包含组信息(如组ID或授权 的UID列表)在文件的元数据

因此,这里是我的问题:

  • 我可以直接使用该文件夹吗?
  • 如何存储授权用户的列表?

我在Swift中编写iOS应用程序。

这里是我的规则实际代码:

service firebase.storage { 
    match /b/on-team.appspot.com/o { 
    match /{allPaths=**} { 
     allow read, write: if request.auth != null; 
    } 
    match /users-projects { 
     match /{projectId} { 
     allow read, write: if ????? 
     } 
    } 
    } 
} 

下面是官方文档:https://firebase.google.com/docs/storage/security/user-security

+0

对不起,如果我犯了一些错误的语言我是意大利人。 – ale00

回答

4

我认为正确的静态规则是:

allow read, write: if request.auth.uid == 'a-user-id' || request.auth.uid == 'another-user-id' || ... 

但我猜你正在寻找动态规则:)

因为这是相当简单的设置与文件夹名称的动态规则业主:

match /users-projects/{projectId}/{userId} { 
    allow read, write: if request.auth.uid == userId 

对于更复杂的情况下,像受邀请的用户,你可以尝试using the custom metadata受邀的UID存储在文件中,并配合他们对用户ID访问该的ressource,例如规则:

allow read: if resource.metadata.invited.matches(request.auth.uid); 

自定义元数据值只能是字符串,所以我建议您将它们保存为昏迷分隔值,因此您可以轻松地编辑,并在同一时间使用的简单匹配,访问规则。

注意:这只是可缩放的,而invitedUids.join(',')的长度比自定义元数据值的最大长度短。 (我不知道这个价值)。如果您的应用不是为了接受数百名受邀用户而构建的,那么应该没问题,否则您可能需要设置服务器端访问机制,为每个受邀用户构建唯一的下载链接,而不是依赖简单的规则。

另外,我不认为你可以使用令牌groupId值来执行你的情况访问安全(如文档描述的),因为你有用户和文件夹/文件之间的关系many-to-many。(用户不会只属于一个组)

因此,要回答你的问题:

  • resource对象的规则只适用于文件,如果使用的元数据来执行访问,他们需要更新在文件夹中的每个文件上,如果他们共享相同的访问规则
  • 元数据只是一个字符串 - >字符串键值存储区,您只需将用户标识符作为字符串存储在任意非保留键中以上。
+0

但我不想在规则文件中对此规则进行硬编码 – ale00

+0

用业主规则更新了我的答案 – Pandaiolo

+0

我再次编辑了我的答案,详细介绍了如何使用文件元数据 – Pandaiolo

1
目录中使用他们的用户ID

存储单个项目

  • /用户的项目/ USER_ID/PROJECT1
  • /用户的项目/ USER_ID /项目2


 service firebase.storage { 
     match /b/on-team.appspot.com/o { 
      match /{allPaths=**} { 
      allow read, write: if request.auth != null; 
      } 
     match /users-projects/{user_id} { 
      allow read, write: if request.auth.uid == user_id 
     } 
     } 
    } 
相关问题