2016-11-19 69 views
2

我的DocumentDb应用程序有几乎是多租户架构。我计划在开始时使用分区密钥,以确保如果它变得流行,整个过程不必重新设计。目前的架构需要单一的异构集合。每个租户架构的集合不会起作用。DocumentDB用户权限 - 按分区键?

所有访问都会包含租户ID以防止泄漏。这不是我所关心的。

我需要客户端只读访问,所以我打算让我的服务器根据每个用户的权限发布资源令牌。

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

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

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

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

TIA

回答

0

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

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

:(

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

我要踢,并通过后台运行它没有一个得到任何键

2

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

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

边注 - 可以请你,请添加一个链接到文件这说明了这一点?这应该由DocumentDB团队纠正。 –