2016-11-19 120 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團隊糾正。 –