我正在尝试使用对用户权限的附加 ResourcePartitionKey 限制来实现此CosmosDB 文档中描述的行为,以将资源令牌限制为仅访问属于指定分区键的文档,但是我无法使其工作。
使用 SQL REST API,我在使用 resourcepartitionkey 密钥对创建 UserPermission 对象的 POST 中没有收到任何错误,并且初始返回的对象以及后续 GET 也显示在获取资源令牌时存在的“resourcepartitionkey”。
针对权限中指定的适当集合使用资源令牌,我可以列出集合中的所有文档。当使用“x-ms-documentdb-partitionkey”标头时,我可以定位任何我喜欢的分区键。如果没有“x-ms-documentdb-partitionkey”标头,它只会返回整个集合。
该集合是一个全新的、无限制的 1000 RU,分区键为“/rpk”。集合的创建后查询显示分区键配置如下
"partitionKey": {
"paths": [
"\/rpk"
],
"kind": "Hash"
}
以下是创建期间返回的用户权限,显示“resourcepartitionkey”存在
{
"resource": "dbs/dbName/colls/collectionName/",
"id": "read-collection",
"resourcepartitionkey": "rpk1",
"permissionMode": "read",
"_rid": "lH9FACGGKwAhslfihB0pAA==",
"_self": "dbs\/lH9FAA==\/users\/lH9FACGGKwA=\/permissions\/lH9FACGGKwAhslfihB0pAA==\/",
"_etag": "\"0000ba07-0000-0000-0000-5b7418770000\"",
"_ts": 1534335095,
"_token": "type=resource&ver=1&sig=<resource token signature>"
}
以下是使用上述资源令牌的文档请求。我希望这会失败,因为针对分区集合缺少“x-ms-documentdb-partitionkey”标头,但它都成功并继续从集合中的所有分区键返回记录(我的测试数据集中只有 2 个)
GET https://accountname.documents.azure.com/dbs/dbName/colls/collectionName/docs HTTP/1.1
authorization: type%3dresource%26ver%3d1%26sig<resource token signature>
x-ms-version: 2017-02-22
x-ms-max-item-count: -1
x-ms-date: Wed, 15 Aug 2018 12:11:35 GMT
User-Agent: Mozilla/5.0 (Windows NT; Windows NT 10.0; en-AU) WindowsPowerShell/5.1.17134.165
Content-Type: application/json
Host: accountname.documents.azure.com
来自上述请求的响应正文显示来自分区键 rpk1 和 rpk2 的文档,即使用户权限配置为 rpk1。
{
"_rid": "lH9FAKbDh4c=",
"Documents": [
{
"id": "blue",
"rpk": "rpk1",
"_rid": "lH9FAKbDh4cCAAAAAAAAAA==",
"_self": "dbs\/lH9FAA==\/colls\/lH9FAKbDh4c=\/docs\/lH9FAKbDh4cCAAAAAAAAAA==\/",
"_etag": "\"ec012ca1-0000-0000-0000-5b73ab440000\"",
"_attachments": "attachments\/",
"_ts": 1534307140
},
{
"id": "red",
"rpk": "rpk2",
"_rid": "lH9FAKbDh4cDAAAAAAAAAA==",
"_self": "dbs\/lH9FAA==\/colls\/lH9FAKbDh4c=\/docs\/lH9FAKbDh4cDAAAAAAAAAA==\/",
"_etag": "\"ec012da1-0000-0000-0000-5b73ab580000\"",
"_attachments": "attachments\/",
"_ts": 1534307160
}
],
"_count": 2
}
我假设我错过了一些明显的东西,或者在 UserPermission 中为“resourcepartitionkey”使用了不正确的值,但我无法确定是什么。任何想法都非常感谢。