我的DocumentDb应用程序几乎有一个多租户架构。我一开始就计划使用分区键,以确保如果它变得流行,整个东西不需要重新设计。当前的架构需要一个单一的异构集合。按租户架构收集是行不通的。
所有访问都将包括租户id,以防止泄漏。这不是我所关心的。
我需要客户端只读访问,所以我计划让我的服务器根据每个用户的权限发布资源令牌。
但我在文档中注意到,每个用户每个资源只能有一个权限。我不想为每个文档创建权限。基本上,我希望每个分区键都有权限。这样,租户id就成为客户端读取的限制因素。
基本上,客户端设备对共享其分区键的集合中的所有文档具有只读访问权。
如果资源令牌被泄露,它只会持续一个小时,任何人都不会访问整个集合,只提供租户的数据。
如果每个权限都有不同的分区键,我可以让单个DocumentDb数据库用户对同一集合拥有多个只读权限吗?
提亚
发布于 2016-11-21 21:57:35
支持每个资源创建多个权限(每个分区键)。下面是一个例子:
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") });发布于 2019-02-03 11:32:11
发布于 2016-11-20 07:52:48
最后,我写了一堆测试,看看我是否可以创建两个权限,每个权限都有不同的名称和不同的分区键,但是对于相同的用户和相同的集合具有相同的读取权限。不行。第二个导致冲突的结果。
因此,试图通过仅为单个集合中的租户分区颁发资源令牌来保护租户的数据是行不通的。
:(
唯一的选择是创建两个不同的集合,在必要时复制数据。在这一点上,我不确定我对安全有多偏执,或者应该有多偏执。
我将使用平底船,并通过一个后端运行它。没人能拿到钥匙。
https://stackoverflow.com/questions/40689110
复制相似问题