2016-11-19 4 views
2

내 DocumentDb 앱에는 거의 다중 점유 아키텍처가 있습니다. 처음부터 파티션 키를 사용하여 인기가 높아지면 전체를 다시 디자인 할 필요가 없도록 계획했습니다. 현재 아키텍처는 하나의 이기종 컬렉션을 요구합니다. 세입자 아키텍처 당 컬렉션은 작동하지 않습니다.DocumentDB 사용자 권한 - 파티션 키 기준?

누출을 방지하기 위해 모든 액세스에는 임차인 ID가 포함됩니다. 그건 내가 걱정하는 것이 아니야.

각 사용자의 권한에 따라 리소스 토큰을 내 서버에 발급하도록 계획하고 있으므로 클라이언트 측 읽기 전용 액세스가 필요합니다.

그러나 문서에서 리소스 당 사용자 당 하나의 권한 만 가질 수 있다는 것을 알았습니다. 각 문서에 대한 사용 권한을 만들고 싶지 않습니다. 기본적으로 각 파티션 키에 대한 사용 권한이 필요합니다. 그런 식으로 세입자 ID는 클라이언트 쪽 읽기에 제약 요인이됩니다.

기본적으로 클라이언트 장치는 파티션 키를 공유하는 컬렉션의 모든 문서에 대한 읽기 전용 액세스 권한을가집니다.

리소스 토큰이 유출되면 1 시간 동안 지속되며 전체 컬렉션에 대한 액세스 권한이 부여되지 않으며 해당 사용자의 데이터 만 액세스 할 수 있습니다.

각 권한에 다른 파티션 키가있는 경우 동일한 컬렉션에 대해 여러 개의 읽기 전용 권한을 가진 단일 DocumentDb 데이터베이스 사용자를 가질 수 있습니까? TIA

답변

0

마지막으로 그냥 다른 이름과 다른 파티션 키를 사용하여 두 개의 권한, 각을 만들 수 있는지 확인하기 위해 테스트의 무리를 작성하지만, 동일한 사용자와 동일한 컬렉션 같은 READ 권한에 대해. 안돼. 두 번째 충돌 결과가 발생했습니다.

그래서 단일 수집에서 해당 파티션의 리소스 토큰 만 발행하여 테넌트의 데이터를 보호하려고 시도하면 작동하지 않습니다.

:(

유일한 대안은이 시점에서, 나는 보안에 대해, 생각, 또는 어떻게해야 편집증 확실하지 않다 필요한 경우. 데이터를 복제, 두 개의 서로 다른 컬렉션을 생성하는 것입니다.

나는 펀트와 백엔드를 통해 모두를 실행하는거야 아무도 어떤 키를 얻을 수 없습니다 자원 당 (각 파티션 키에 대한) 여러 권한을 만들 지원

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 팀에서 해결해야합니다. –