允许仅由某些用户

时间:2016-08-31 11:30:12

标签: ios swift firebase firebase-security firebase-storage

我的存储目录中有一个名为users-projects的主“文件夹”,然后我为每个用户的项目创建文件夹。我希望允许用户仅访问他们的项目以及邀请他们加入的项目,例如包含协作者的Dropbox或Google云端硬盘文件夹。

在文档中他们说:

  

包括组信息(例如组ID或授权列表)   文件元数据中的uids)

所以这是我的问题:

  • 我可以直接使用该文件夹吗?
  • 如何存储授权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

2 个答案:

答案 0 :(得分:5)

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

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进行匹配,例如:

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

自定义元数据值只能是字符串,因此我建议您将它们存储为逗号分隔值,以便您可以轻松编辑它们,同时在访问规则中使用简单匹配。

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

此外,我认为您不能使用令牌groupId值来强制执行您的案例中的访问安全性(如文档中所述),因为您在用户和用户之间存在many-to-many关系文件夹/文件。 (用户不只属于一个组)

所以,回答你的问题:

  • 规则中的resource对象仅适用于文件,如果使用元数据强制访问,如果它们共享相同的访问规则,则需要更新文件夹中的每个文件
  • 元数据只是一个string->字符串键值存储,您只需将用户ID作为字符串存储在任意非保留键中,如上所述。

答案 1 :(得分:2)

使用用户标识

将单个项目存储在目录中
  • /用户的项目/ 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 
         }
      }
    }