为 Role 授予 Privilege 或 Privilege Group
创建角色后,就可以向角色授予权限。本指南将介绍如何向角色授予权限或权限组。
向 Role 授予 Privilege 或 Privilege Group
Milvus 2.5 引入了新版本的 API,简化了授予操作。向角色授予权限时,不再需要查找对象类型。以下是参数和相应的解释。
-
role_name:需要授予权限或权限组的目标角色名称。
-
资源:特权的目标资源,可以是特定实例、数据库或 Collection。
下表解释了如何在 client.grantV2() 方法中指定资源。
级别 | 资源 | 授予方法 | 注释 |
|---|---|---|---|
Collection | 特定 Collection | | 输入目标 Collection 的名称以及目标 Collection 所属数据库的名称。 |
特定数据库下的所有 Collection | | 输入目标数据库名称和通配符 | |
数据库 | 特定数据库 | | 输入目标数据库的名称和通配符 |
当前实例下的所有数据库 | | 输入 | |
实例 | 当前实例 | | 输入 |
- 权限:需要授予角色的特定权限或 权限组。目前,Milvus 提供了 56 种可授予的特权。下表列出了 Milvus 中的特权。
下表中的类型列是用户为方便快速查找特权而设置的,仅用于分类目的。授予权限时,不需要了解类型。只需输入相应的权限即可。
类型 | 权限 | 说明 | 客户端的相关 API 说明 |
|---|---|---|---|
数据库权限 | ListDatabases | 查看当前实例中的所有数据库 | |
DescribeDatabase | 查看数据库的详细信息 | ||
CreateDatabase | 创建数据库 | ||
DropDatabase | 删除数据库 | ||
AlterDatabase | 修改数据库属性 | ||
Collection 权限 | GetFlushState | 检查 Collection Flush 操作的状态 | |
GetLoadState | 检查 Collection 的加载状态 | ||
GetLoadingProgress | 检查 Collection 的加载进度 | ||
ShowCollections | 查看具有 Collection 权限的所有 Collection | ||
ListAliases | 查看某个 Collection 的所有别名 | ||
DescribeCollection | 查看 Collection 的详细信息 | ||
DescribeAlias | 查看别名的详细信息 | ||
GetStatistics | 获取 Collection 的统计数据(如 Collection 中实体的数量) | ||
CreateCollection | 创建 Collection | ||
DropCollection | 删除 Collection | ||
Load | 加载 Collection | ||
Release | 释放一个 Collection | ||
Flush | 将 Collection 中的所有实体持久化到一个密封段中。任何在 Flush 操作后插入的实体都将存储在新的段中。 | ||
Compaction | 手动触发压缩 | ||
RenameCollection | 重命名 Collection | ||
CreateAlias | 为 Collection 创建别名 | ||
DropAlias | 删除 Collection 的别名 | ||
FlushAll | 清除数据库中的所有 Collection | ||
Partition 权限 | HasPartition | 检查是否存在 Partition | |
ShowPartitions | 查看 Collection 中的所有 Partition | ||
CreatePartition | 创建 Partition | ||
DropPartition | 删除 Partition | ||
索引权限 | IndexDetail | 查看索引的详细信息 | |
CreateIndex | 创建索引 | ||
DropIndex | 删除索引 | ||
资源管理权限 | LoadBalance | 实现负载平衡 | |
CreateResourceGroup | 创建资源组 | ||
DropResourceGroup | 删除资源组 | ||
UpdateResourceGroups | 更新资源组 | ||
DescribeResourceGroup | 查看资源组的详细信息 | ||
ListResourceGroups | 查看当前实例的所有资源组 | ||
TransferNode | 在资源组之间转移节点 | ||
TransferReplica | 在资源组之间传输副本 | ||
BackupRBAC | 为当前实例中所有与 RBAC 相关的操作创建备份 | BackupRBAC | |
RestoreRBAC | 恢复当前实例中所有 RBAC 相关操作的备份 | RestoreRBAC | |
实体权限 | Query | 进行查询 | |
Search | 进行搜索 | ||
Insert | 插入实体 | ||
Delete | 删除实体 | ||
Upsert | 插入实体 | ||
Import | 批量插入或导入实体 | ||
RBAC 权限 | CreateOwnership | 创建用户或角色 | |
UpdateUser | 更新用户密码 | ||
DropOwnership | 删除用户密码或角色 | ||
SelectOwnership | 查看被授予特定角色的所有用户 | ||
ManageOwnership | 管理用户或角色,或向用户授予角色 | ||
SelectUser | 查看授予用户的所有角色 | ||
CreatePrivilegeGroup | 创建权限组 | ||
DropPrivilegeGroup | 删除权限组 | ||
ListPrivilegeGroups | 查看当前实例中的所有特权组 | ||
OperatePrivilegeGroup | 向特权组添加特权或从特权组移除特权 |
下面的示例演示了如何在 default 数据库下的 collection_01 上授予 PrivilegeSearch 权限,以及如何将名为 privilege_group_1 的特权组授予角色 role_a。
- Python
- Java
- Node.js
- Go
- cURL
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
client.grant_privilege_v2(
role_name="role_a",
privilege="Search",
collection_name='collection_01',
db_name='default',
)
client.grant_privilege_v2(
role_name="role_a",
privilege="privilege_group_1",
collection_name='collection_01',
db_name='default',
)
client.grant_privilege_v2(
role_name="role_a",
privilege="ClusterReadOnly",
collection_name='*',
db_name='*',
)
import io.milvus.v2.service.rbac.request.GrantPrivilegeReqV2;
client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
.roleName("role_a")
.privilege("Search")
.collectionName("collection_01")
.dbName("default")
.build());
client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
.roleName("role_a")
.privilege("privilege_group_1")
.collectionName("collection_01")
.dbName("default")
.build());
client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
.roleName("role_a")
.privilege("ClusterReadOnly")
.collectionName("*")
.dbName("*")
.build());
import {MilvusClient} from "@zilliz/milvus2-sdk-node";
const client = new MilvusClient({
address: "http://localhost:19530",
token: "root:Milvus",
});
await client.grantPrivilegeV2({
role: "role_a",
privilege: "Search",
collection_name: "collection_01",
db_name: "default",
});
await client.grantPrivilegeV2({
role: "role_a",
privilege: "privilege_group_1",
collection_name: "collection_01",
db_name: "default",
});
await client.grantPrivilegeV2({
role: "role_a",
privilege: "ClusterReadOnly",
collection_name: "*",
db_name: "*",
});
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v2/milvusclient"
)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
client, err := milvusclient.New(ctx, &milvusclient.ClientConfig{
Address: "localhost:19530",
APIKey: "root:Milvus",
})
if err != nil {
fmt.Println(err.Error())
// handle error
}
defer client.Close(ctx)
err = client.GrantV2(ctx, milvusclient.NewGrantV2Option("role_a", "Search", "default", "collection_01"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
err = client.GrantV2(ctx, milvusclient.NewGrantV2Option("role_a", "privilege_group_1", "default", "collection_01"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
err = client.GrantV2(ctx, milvusclient.NewGrantV2Option("role_a", "ClusterReadOnly", "*", "*"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "Search",
"collectionName": "collection_01",
"dbName":"default"
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "privilege_group_1",
"collectionName": "collection_01",
"dbName":"default"
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "ClusterReadOnly",
"collectionName": "*",
"dbName":"*"
}'
描述 Role
下面的示例演示了如何使用 describe_role 方法查看授予角色 role_a 的权限。
- Python
- Java
- Node.js
- Go
- cURL
from pymilvus import MilvusClient
client.describe_role(role_name="role_a")
import io.milvus.v2.service.rbac.response.DescribeRoleResp;
import io.milvus.v2.service.rbac.request.DescribeRoleReq;
DescribeRoleReq describeRoleReq = DescribeRoleReq.builder()
.roleName("role_a")
.build();
DescribeRoleResp resp = client.describeRole(describeRoleReq);
List<DescribeRoleResp.GrantInfo> infos = resp.getGrantInfos();
await client.describeRole({roleName: 'role_a'});
import "github.com/milvus-io/milvus/client/v2/milvusclient"
role, err := client.DescribeRole(ctx, milvusclient.NewDescribeRoleOption("role_a"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/describe" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a"
}'
下面是一个输出示例。
{
"role": "role_a",
"privileges": [
{
"collection_name": "collection_01",
"db_name": "default",
"role_name": "role_a",
"privilege": "Search",
"grantor_name": "root"
},
"privilege_group_1"
]
}
撤销 Role 的 Privilege 或 Privilege Group
下面的示例演示了如何撤销 default 数据库下 collection_01 的特权 PrivilegeSearch 以及授予角色 role_a 的特权组 privilege_group_1。
- Python
- Java
- Node.js
- Go
- cURL
client.revoke_privilege_v2(
role_name="role_a",
privilege="Search",
collection_name='collection_01',
db_name='default',
)
client.revoke_privilege_v2(
role_name="role_a",
privilege="privilege_group_1",
collection_name='collection_01',
db_name='default',
)
client.revoke_privilege_v2(
role_name="role_a",
privilege="ClusterReadOnly",
collection_name='*',
db_name='*',
)
import io.milvus.v2.service.rbac.request.RevokePrivilegeReqV2;
client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
.roleName("role_a")
.privilege("Search")
.collectionName("collection_01")
.dbName("default")
.build());
client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
.roleName("role_a")
.privilege("privilege_group_1")
.collectionName("collection_01")
.dbName("default")
.build());
client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
.roleName("role_a")
.privilege("ClusterReadOnly")
.collectionName("*")
.dbName("*")
.build());
await client.revokePrivilegeV2({
role: 'role_a',
privilege: 'Search',
collection_name: 'collection_01',
db_name: 'default'
});
await client.revokePrivilegeV2({
role: 'role_a',
collection_name: 'collection_01',
privilege: 'Search',
db_name: 'default'
});
await client.revokePrivilegeV2({
role: 'role_a',
collection_name: '*',
privilege: 'ClusterReadOnly',
db_name: '*'
});
err = client.RevokePrivilegeV2(ctx, milvusclient.NewRevokePrivilegeV2Option("role_a", "Search", "collection_01").
WithDbName("default"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
err = client.RevokePrivilegeV2(ctx, milvusclient.NewRevokePrivilegeV2Option("role_a", "privilege_group_1", "collection_01").
WithDbName("default"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
err = client.RevokePrivilegeV2(ctx, milvusclient.NewRevokePrivilegeV2Option("role_a", "ClusterReadOnly", "*").
WithDbName("*"))
if err != nil {
fmt.Println(err.Error())
// handle error
}
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "Search",
"collectionName": "collection_01",
"dbName":"default"
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "Search",
"collectionName": "collection_01",
"dbName":"default"
}'
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
--header "Request-Timeout: 10" \
-d '{
"roleName": "role_a",
"privilege": "ClusterReadOnly",
"collectionName": "*",
"dbName":"*"
}'