允许仅由某些用户访问Firebase存储桶

ale*_*e00 4 ios firebase firebase-security swift firebase-storage

我的存储目录中有一个主"文件夹" users-projects,然后我为每个用户的项目创建文件夹.我想允许用户仅访问他们的项目以及邀请他们参与的项目,例如带有协作者的Dropbox或Google Drive文件夹.

他们在文档中说:

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

所以这是我的问题:

  • 我可以直接使用该文件夹吗?
  • 如何存储授权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 ?????
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Pan*_*olo 5

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

allow read, write: if request.auth.uid == 'a-user-id' || request.auth.uid == 'another-user-id' || ...
Run Code Online (Sandbox Code Playgroud)

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

对于所有者来说,使用文件夹名称设置动态规则非常简单:

match /users-projects/{projectId}/{userId} {
    allow read, write: if request.auth.uid == userId 
Run Code Online (Sandbox Code Playgroud)

对于受邀用户等更复杂的情况,您可以尝试使用自定义元数据在文件中存储受邀的uid,并将其与访问该资源的用户ID进行匹配,例如:

allow read: if resource.metadata.invited.matches(request.auth.uid);
Run Code Online (Sandbox Code Playgroud)

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

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

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

那么,回答你的问题:

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