DocumentDB用户权限 - 通过分区键?

问题描述 投票:3回答:3

我DocumentDb应用程序有非常多租户架构。我打算使用分区键就在一开始就确保整个事情没有得到重新设计,如果它变得受欢迎。当前的体系结构要求一个单一的均质集合体。每个租户架构的集合是行不通的。

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

我需要客户端进行只读访问,所以我就根据每个用户的权限有我的服务器问题资源令牌规划。

但我注意到,你只能有每资源使用者一个许可的文件中。我不想为每个文件的权限。基本上,我想每个分区键的权限。这样一来,租户ID成为客户端上的制约因素读取。

基本上,客户端设备也只读到共享的分区键集合中的所有的文件访问。

如果资源令牌被攻破,它只能持续一个小时,它不会给任何人访问整个集合,只是租户的数据。

我可以有多个单DocumentDb数据库用户在同一个集合只读权限,如果每个权限都有不同的分区键?

TIA

permissions key azure-cosmosdb partition
3个回答
4
投票

它支持创建多个权限每个资源(每个分区键)。下面是一个例子:

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") });

1
投票

这个答案让我:

Cosmos DB partitioned access to a database

使用海报提供的代码,我能得到分区权限的工作。


0
投票

最后只是写了一些测试,看看我是否可以创建两个权限,每一个不同的名称和不同的分区键,但对于同一用户和同一集合相同读取权限。没有去。第二个导致了冲突的结果。

因此,试图通过发行唯一的资源标记为他们在一个单一的集合分区不工作,保护租户的数据。

:(

唯一的选择是创建两个不同的集合,在必要的时候复制数据。在这一点上,我不知道我是多么偏执是,或者应该是安全问题。

我要踢,并通过后台运行它。没有人会任意键。

© www.soinside.com 2019 - 2024. All rights reserved.