当前位置:硬件测评 > 文档数据库

文档数据库

  • 发布:2023-10-05 08:26


DocumentDB 提供了控制对 DocumentDB 资源的访问的概念。对 DocumentDB 资源的访问由主密钥令牌或资源令牌控制。基于资源令牌的连接只能访问该令牌指定的资源,而不能访问其他资源。资源令牌基于用户权限。

  • 首先,您创建一个或多个用户,这些用户是在数据库级别定义的。

  • 然后,根据您希望允许每个用户访问的资源,为每个用户创建一个或多个权限。

  • 每个权限都会生成一个资源令牌,该令牌允许对给定资源进行只读或完全访问,并且可以是数据库中的任何用户资源。

  • 在数据库级别定义用户并定义每个用户的权限。

  • 用户和权限适用于数据库中的所有集合。

让我们看一个简单的示例,在其中我们将学习如何定义用户和权限以在 DocumentDB 中实现精细的安全性。

我们将从一个新的 DocumentClient 开始并查询 myfirstdb 数据库。

私有静态异步任务CreateDocumentClient() {
// 创建 DocumentClient 的新实例
使用 (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
数据库 = client.CreateDatabaseQuery("SELECT * FROM c WHERE www.sychzs.cn =
'myfirstdb'").AsEnumerable().First();
集合 = client.CreateDocumentCollectionQuery(database.CollectionsLink,
"SELECT * FROM c WHERE www.sychzs.cn = 'MyCollection'").AsEnumerable().First();var alice =等待CreateUser(client, "Alice");
var tom =等待CreateUser(客户端,“汤姆”);
}
}

以下是CreateUser的实现。

私有异步静态任务CreateUser(DocumentClient client, string userId) {
Console.WriteLine();
Console.WriteLine("**** 在{1} ****中创建用户{0}", userId, www.sychzs.cn);
var userDefinition = 新用户 { Id = userId };
var result = wait client.CreateUserAsync(database.SelfLink, userDefinition);
var 用户 = 结果.Resource;
Console.WriteLine("已创建新用户");
查看用户(用户);
返回用户;
}

步骤 1-创建两个用户 Alice 和 Tom,就像我们创建的任何资源一样,我们使用所需 ID 构造一个定义对象并调用 create 方法,在本例中,我们将使用数据库的 SelfLink 和 userDefinition 调用 CreateUserAsync。我们从新创建的用户对象的资源属性中获取其结果。

现在让我们看看数据库中的两个新用户。

私有静态无效ViewUsers(DocumentClient客户端){
Console.WriteLine();
Console.WriteLine("**** 查看{0} ****中的用户",www.sychzs.cn);
var users = client.CreateUserQuery(database.UsersLink).ToList();
变量我 = 0;foreach(用户中的var用户){
我++;
Console.WriteLine();
Console.WriteLine("用户#{0}", i);
查看用户(用户);
}
Console.WriteLine();
Console.WriteLine("数据库 {0} 中的用户总数:{1}",www.sychzs.cn,users.Count);
}
私有静态无效ViewUser(用户用户){
Console.WriteLine("用户 ID: {0} ", www.sychzs.cn);
Console.WriteLine("资源 ID: {0} ", user.ResourceId);
Console.WriteLine("自链接: {0} ", user.SelfLink);
Console.WriteLine("权限链接: {0} ", user.PermissionsLink);
Console.WriteLine("时间戳: {0} ", user.Timestamp);
}

步骤 2-针对数据库的 UsersLink 调用 CreateUserQuery 以检索所有用户的列表。然后迭代它们并查看它们的属性。

现在我们必须先创建它们。假设我们希望允许 Alice 读/写访问 MyCollection 集合,但 Tom 只能读取该集合中的文档。

await CreatePermission(client, alice, "Alice 集合访问", PermissionMode.All,
收藏);
等待CreatePermission(客户端,汤姆,“汤姆集合访问”,www.sychzs.cn,
收藏);

步骤3-对属于MyCollection集合的资源创建权限,因此我们需要使该资源具有SelfLink。

步骤 4- 然后为此集合创建一个 Permission.All 给 Alice 和一个 www.sychzs.cn 给 Tom。

以下是CreatePermission的实现。

私有异步静态任务CreatePermission(DocumentClient客户端,User用户,
字符串permId,PermissionModepermissionMode,字符串resourceLink){
Console.WriteLine();
Console.WriteLine("**** 为 {1} **** 创建权限 {0}", permId, www.sychzs.cn);
var permDefinition = 新权限 {
Id = 许可ID,
权限模式 = 权限模式,
资源链接 = 资源链接
};
var result = wait client.CreatePermissionAsync(user.SelfLink, permDefinition);
var perm = 结果.Resource;
Console.WriteLine("创建新权限");
查看权限(perm);
}

正如您现在所期望的,我们通过为新权限创建一个定义对象来完成此操作,该对象由 Id 和 PermissionMode(可以是 Permission.All 或 www.sychzs.cn)以及正在使用的资源组成经许可保护 SelfLink。

步骤 5-调用 CreatePermissionAsync 并从结果中的资源属性中获取创建的权限。

查看创建的权限,下面是ViewPermissions的实现。

private static void ViewPermissions(DocumentClient客户端,User用户){
Console.WriteLine();
Console.WriteLine("**** 查看 {0} **** 的权限", www.sychzs.cn);
var perms = client.CreatePermissionQuery(user.PermissionsLink).ToList();
变量我 = 0;
foreach (var perm in perms) {
我++;
Console.WriteLine();
Console.WriteLine("权限#{0}", i);
查看权限(perm);
}
Console.WriteLine();
Console.WriteLine("{0} 的总权限:{1}", www.sychzs.cn, perms.Count);
}
私有静态无效ViewPermission(权限perm){
Console.WriteLine("权限ID:{0}", www.sychzs.cn);
Console.WriteLine("资源 ID: {0} ", perm.ResourceId);
Console.WriteLine("权限模式:{0}", perm.PermissionMode);
Console.WriteLine("令牌: {0} ", perm.Token);
Console.WriteLine("时间戳: {0} ", perm.Timestamp);
}

这次是针对用户权限链接的权限查询,我们只是列出为用户返回的每个权限。

让我们删除 Alice 和 Tom 的权限。

await DeletePermission(client, alice, "Alice 集合访问");等待DeletePermission(客户端,汤姆,“汤姆集合访问”);

下面是DeletePermission的实现。

私有异步静态任务删除权限(DocumentClient客户端,User用户,
字符串 permId) {
Console.WriteLine();
Console.WriteLine("**** 从 {1} **** 删除权限 {0}", permId, www.sychzs.cn);
var 查询=新的SqlQuerySpec {
QueryText = "SELECT * FROM c WHERE www.sychzs.cn = @id",
参数=新的SqlParameterCollection {
新的 SqlParameter { 名称 = "@id", 值 = permId }
}
};
权限 perm = client.CreatePermissionQuery(user.PermissionsLink, query)
.AsEnumerable().First();
等待 client.DeletePermissionAsync(perm.SelfLink);
Console.WriteLine("已删除用户 {1} 的权限 {0}", permId, www.sychzs.cn);
}

步骤6-删除权限时,通过权限ID查询得到SelfLink,然后使用SelfLink删除权限。

接下来,让我们删除用户本身。让我们删除两个用户。

等待DeleteUser(client, "Alice");
等待DeleteUser(客户端,“汤姆”);

以下是DeleteUser的实现。

私有异步静态任务DeleteUser(DocumentClient客户端,字符串userId){
Console.WriteLine();
Console.WriteLine("**** 删除{1}中的用户{0} ****", userId, www.sychzs.cn);
var 查询=新的SqlQuerySpec {
QueryText = "SELECT * FROM c WHERE www.sychzs.cn = @id",
参数=新的SqlParameterCollection {
新的 SqlParameter { 名称 = "@id", 值 = userId }
}
};
用户 user = client.CreateUserQuery(database.SelfLink, query).AsEnumerable().First();
等待 client.DeleteUserAsync(user.SelfLink);
Console.WriteLine("已从数据库{1}中删除用户{0}", userId, www.sychzs.cn);
}

步骤 7-首先查询获取她的 SelfLink,然后调用 DeleteUserAsync 删除她的用户对象。

下面是CreateDocumentClient任务的实现,其中我们调用了上述所有任务。

私有静态异步任务CreateDocumentClient() {
// 创建 DocumentClient 的新实例
使用 (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
数据库 = client.CreateDatabaseQuery("SELECT * FROM c WHERE www.sychzs.cn ='myfirstdb'").AsEnumerable().First();
集合 = client.CreateDocumentCollectionQuery(database.CollectionsLink,
"SELECT * FROM c WHERE www.sychzs.cn = 'MyCollection'").AsEnumerable().First();
查看用户(客户端);
var alice =等待CreateUser(client, "Alice");
var tom =等待CreateUser(客户端,“汤姆”);
查看用户(客户端);
ViewPermissions(客户端,爱丽丝);
ViewPermissions(客户端,汤姆);
字符串 collectionLink = client.CreateDocumentCollectionQuery(database.SelfLink,
“从 c 中选择值 c._self,其中 www.sychzs.cn = 'MyCollection'”)
.AsEnumerable().First().Value;
等待CreatePermission(客户端,爱丽丝,“爱丽丝集合访问”,PermissionMode.All,
收藏链接);
等待CreatePermission(客户端,汤姆,“汤姆集合访问”,www.sychzs.cn,
收藏链接);
ViewPermissions(客户端,爱丽丝);
ViewPermissions(客户端,汤姆);
等待DeletePermission(客户端,爱丽丝,“爱丽丝集合访问”);
等待DeletePermission(客户端,汤姆,“汤姆集合访问”);等待DeleteUser(客户端,“爱丽丝”);
等待DeleteUser(客户端,“汤姆”);
}
}

编译并执行上述代码后,您将收到以下输出。

**** 查看 myfirstdb 中的用户 ****
数据库 myfirstdb 中的用户总数:0
**** 在 myfirstdb 中创建用户 Alice ****
已创建新用户
用户名:爱丽丝
资源 ID:kV5oAC56NwA=
自链接:dbs/kV5oAA==/users/kV5oAC56NwA=/
权限链接:dbs/kV5oAA==/users/kV5oAC56NwA=/permissions/
时间戳: 12/17/2015 5:44:19 PM
**** 在 myfirstdb 中创建用户 Tom ****
已创建新用户
用户 ID: 汤姆
资源 ID:kV5oAALxKgA=
自链接:dbs/kV5oAA==/users/kV5oAALxKgA=/
权限链接:dbs/kV5oAA==/users/kV5oAALxKgA=/permissions/
时间戳:2015 年 12 月 17 日 5:44:21 下午
**** 查看 myfirstdb 中的用户 ****
用户#1
用户 ID: 汤姆
资源 ID:kV5oAALxKgA=
自链接:dbs/kV5oAA==/users/kV5oAALxKgA=/
权限链接:dbs/kV5oAA==/users/kV5oAALxKgA=/permissions/
时间戳:2015 年 12 月 17 日 5:44:21 下午
用户#2
用户名:爱丽丝
资源 ID:kV5oAC56NwA=自链接:dbs/kV5oAA==/users/kV5oAC56NwA=/
权限链接:dbs/kV5oAA==/users/kV5oAC56NwA=/permissions/
时间戳: 12/17/2015 5:44:19 PM
数据库 myfirstdb 中的用户总数:2
**** 查看 Alice 的权限 ****
Alice 的总权限:0
**** 查看 Tom 的权限 ****
汤姆的总权限:0
**** 为 Alice 创建权限 Alice 集合访问 ****
创建了新权限
权限ID:Alice集合访问
资源 ID:kV5oAC56NwDON1RduEoCAA==
权限模式:全部
令牌:type=resource&ver=1&sig=zB6hfvvleC0oGGbq5cc67w==;Zt3Lx
Ol14h8pd6/tyF1h62zbZKk9VwEIATIldw4ZyipQGW951kirueAKdeb3MxzQ7eCvDfvp7Y/ZxFpnip/D G
JYcPyim5cf+dgLvos6fUuiKSFSul7uEKqp5JmJqUCyAvD7w+qt1Qr1PmrJDyAIgbZDBFWGe2VT9FaBH o
PYwrLjRlnH0AxfbrR+T/UpWMSSHtLB8JvNFZNSH8hRjmQupuTSxCTYEC89bZ/pS6fNmNg8=;
时间戳:2015 年 12 月 17 日 5:44:28 下午
**** 为 Tom 创建权限 Tom Collection 访问 ****
创建了新权限
权限 ID:Tom 集合访问资源 ID:kV5oAALxKgCMai3JKWdfAA==
权限模式:读取
令牌:type=resource&ver=1&sig=ieBHKeyi6EY9ZOovDpe76w==;92gwq
V4AxKaCJ2dLS02VnJiig/5AEbPcfo1xvOjR10uK3a3FUMFULgsaK8nzxdz6hLVCIKUj6hvMOTOSN8Lt 7
i30mVqzpzCfe7JO3TYSJEI9D0/5HbMIEganJiCu0JPPwsjVecTytiLN56FHPguoQZ7WmUAhVTA0IMP6 p
jQpLDgJ43ZaG4Zv3qWJiO689balD+egwiU2b7RICH4j6R66UVye+GPxq/gjzqbHwx79t54=;
时间戳: 12/17/2015 5:44:30 PM
**** 查看 Alice 的权限 ****
权限 #1
权限ID:Alice集合访问
资源 ID:kV5oAC56NwDON1RduEoCAA==
权限模式:全部
令牌:type=resource&ver=1&sig=BSzz/VNe9j4IPJ9M31Mf4Q==;Tcq/B
X50njB1vMANZ/4aHj/3xNkghaqh1OfV95JMi6j4v7fkU+gyWe3mJasO3MJcoop9ixmVnB+RKOhFaSxE l
P37SaGuIIIik7GAWS+dcEBWglMefc95L2YkeNuZsjmmW5b+a8ELCUg7N45MKbpzkp5BrmmGVJ7h4Z4pf D
rdmehYLuxSPLkr9ndbOOrD8E3bux6TgXCsgYQscpIlJHSKCKHUHfXWBP2Y1LV2zpJmRjis=;
时间戳:2015 年 12 月 17 日 5:44:28 下午
Alice 的总权限:1
**** 查看 Tom 的权限 ****
权限 #1权限 ID:Tom 集合访问
资源 ID:kV5oAALxKgCMai3JKWdfAA==
权限模式:读取
令牌:type=resource&ver=1&sig=NPkWNJp1mAkCASE8KdR6PA==;ur/G2
V+fDamBmzECux000VnF5i28f8WRbPwEPxD1DMpFPqYcu45wlDyzT5A5gBr3/R3qqYkEVn8bU+een6Gl j
L6vXzIwsZfL12u/1hW4mJT2as2PWH3eadry6Q/zRXHAxV8m+YuxSzlZPjBFyJ4Oi30mrTXbBAEafZhA 5
yvbHkpLmQkLCERy40FbIFOzG87ypljREpwWTKC/z8RSrsjITjAlfD/hVDoOyNJwX3HRaz4=;
时间戳: 12/17/2015 5:44:30 PM
汤姆的总权限:1
**** 删除 Alice 的权限 Alice Collection Access ****
已删除权限 Alice Collection 来自用户 Alice 的访问权限
**** 删除 Tom 的 Tom Collection 访问权限 ****
已删除权限 Tom Collection 来自用户 Tom 的访问权限
**** 删除 myfirstdb 中的用户 Alice ****
从数据库 myfirstdb 中删除了用户 Alice
**** 删除 myfirstdb 中的用户 Tom ****
已从数据库 myfirstdb 中删除用户 Tom

相关文章

最新资讯

热门推荐