首页 > 解决方案 > 用于按用户将文档上传到 Azure 并保持私有的选项

问题描述

我们正在 azure 中创建一个多租户应用程序,该应用程序必须在用户/租户之间隔离数据。

每个租户将上传/保存各种文档(主要是 excel 和 csv 文件),然后能够在应用程序中使用/检索这些文件作为一系列计算的输入文件。

我想像这样的结构:

+ users/
|-+ {uid}/
| | — profile_picture.jpg
| |-+ input_data/
| | | — {input_data_id}.xlsx

在使用 Firebase 安全规则的 Cloud Storage 中,我们可以使用如下规则保护谁可以对存储在不同路径中的对象执行哪些操作。

rules_version = "2";
service firebase.storage {
  match /b/{bucket}/o {
    match /users/{userId}/input_data/{input_data_id} {
      allow get: if request.auth.uid == userId ||
      allow list, write: if request.auth.uid == userId;
    }
  }
}

azure 中是否有类似的资源可以执行诸如 firestore 之类的操作?

我在 2015 年发现了一个类似问题的问题/答案,我想知道答案是否仍然相关,或者现在是否有更好的选择

在 Azure 中管理多租户存储的最有效方法是什么?

标签: azureazure-storageazure-cosmosdbazure-blob-storageazure-table-storage

解决方案


您找到的文章仍然适用。在 Azure 中,没有针对此类场景的 Firebase 规则等内置安全规则。所以你需要自己实现授权。核心思想是为每个租户创建 Blob Containers,容器名称可以是租户 ID,并构建代理 API 以代表用户获取文件。

考虑到Azure 存储的可扩展性和性能目标,您还可以创建一个存储帐户池,然后将每个租户的数据平均分配到多个存储帐户中。但是通过这种方式,您还需要一个单独的表来存储映射信息,以便 API 知道在哪里可以找到数据。

数据结构可以是:

+ StorageAccount1
 + ContainerTenantID/
 |-+ {uid}/
 | | — profile_picture.jpg
 | |-+ input_data/
 | | | — {input_data_id}.xlsx
 + ContainerTenantID/
 |-+ {uid}/
 | | — profile_picture.jpg
 | |-+ input_data/
 | | | — {input_data_id}.xlsx
+ StorageAccount2
 + ContainerTenantID/
 |-+ {uid}/
 | | — profile_picture.jpg
 | |-+ input_data/
 | | | — {input_data_id}.xlsx

关于代理 API,它决定用户可以访问哪些数据。如果使用 Azure AD,它可以从登录用户的令牌中获取租户 ID 和 UID。然后它有足够的信息来决定将哪些数据返回给用户。


推荐阅读