首页 文章

DocumentDB用户权限 - 按分区键?

提问于
浏览
2

我的DocumentDb应用程序几乎具有多租户架构 . 我计划在一开始就使用分区键,以确保如果它变得流行,整个事情就不必重新设计 . 当前的体系结构需要单个异构集合 . 每个租户架构的集合不起作用 .

所有访问都包括租户ID,以防止泄漏 . 这不是我所关心的 .

我需要客户端只读访问权限,因此我计划根据每个用户的权限让我的服务器发出资源令牌 .

但我在文档中注意到每个资源每个用户只能拥有一个权限 . 我不想为每个文档创建权限 . 基本上我想要每个分区键的权限 . 这样,租户id成为客户端读取的约束因素 .

基本上,客户端设备对集合中共享其分区密钥的所有文档具有只读访问权限 .

如果资源令牌受到损害,它只会持续一个小时,并且不会让任何人访问整个集合,只有租户的数据 .

如果每个权限具有不同的分区键,是否可以让单个DocumentDb数据库用户对同一个集合具有多个只读权限?

TIA

2 回答

  • 0

    支持为每个资源创建多个权限(对于每个分区键) . 这是一个例子:

    User user = await client.CreateUserAsync(UriFactory.CreateDatabaseUri("SampleDatabase"), new User { Id = "NewUser" });
    Permission permission = await client.CreatePermissionAsync(
        user.SelfLink, 
        new Permission
        {
            Id = "ReadA",
            PermissionMode = PermissionMode.Read,
            ResourcePartitionKey = new PartitionKey("Andersen"),
            ResourceLink = collection.SelfLink
        });
    
    Permission permission2 = await client.CreatePermissionAsync(
        user.SelfLink,
        new Permission
        {
            Id = "ReadW",
            PermissionMode = PermissionMode.Read,
            ResourcePartitionKey = new PartitionKey("Wakefield"),
            ResourceLink = collection.SelfLink
        });
    

    权限适用于具有相同分区键的所有文档 . 因此,当您使用具有权限的分区键访问文档时,DocumentDB会成功返回文档,但使用另一个分区键,DocumentDB会返回授权错误:

    DocumentClient restrictedClient1 = new DocumentClient(
       new Uri("https://FILLME:443/"), 
       permission.Token);
    
    // Succeeds
    await restrictedClient1.ReadDocumentAsync(
        UriFactory.CreateDocumentUri("SampleDatabase", "SampleCollection", "AndersenFamily"),
        new RequestOptions { PartitionKey = new PartitionKey("Andersen") });
    
    // Fails
    await restrictedClient1.ReadDocumentAsync(
        UriFactory.CreateDocumentUri("SampleDatabase", "SampleCollection", "WakefieldFamily"),
        new RequestOptions { PartitionKey = new PartitionKey("Wakefield") });
    
  • 3

    最后,我写了一堆测试,看看我是否可以创建两个权限,每个权限具有不同的名称和不同的分区键,但是对于相同的用户和同一个集合上的相同READ权限 . 不行 . 第二个导致了冲突结果 .

    因此,尝试通过在单个集合中仅为其分区发布资源令牌来保护租户的数据不起作用 .

    :(

    唯一的选择是创建两个不同的集合,必要时复制数据 . 在这一点上,我不确定我对安全有多么偏执 .

    我要打桩并通过后端运行它 . 没有人得到任何钥匙 .

相关问题