启用 RBAC
通过启用 RBAC,您可以基于用户角色和权限控制对特定 Milvus 资源(例如集合或分区)或权限的访问。目前,此功能仅在 Python 和 Java 中可用。
本主题描述了如何启用 RBAC 并管理用户和角色。
本页面上的代码片段使用新的MilvusClient(Python)与 Milvus 进行交互。其他语言的新 MilvusClient SDK 将在未来更新中发布。
1. 初始化 Milvus 客户端以建立连接
在启用用户认证后,使用包含用户名和密码的 token
连接到您的 Milvus 实例。默认情况下,Milvus 使用用户名为 root
,密码为 Milvus
的用户。
from pymilvus import MilvusClient
client = MilvusClient(
uri='http://localhost:19530', # 替换为您自己的 Milvus 服务器地址
token='root:Milvus' # 替换为您自己的 Milvus 服务器 token
)
2. 创建用户
创建一个名为 user_1
,密码为 P@ssw0rd
的用户:
client.create_user(
user_name='user_1',
password='P@ssw0rd'
)
创建用户后,您可以:
- 更新用户密 码。您需要提供原始密码和新密码。
client.update_password(
user_name='user_1',
old_password='P@ssw0rd',
new_password='P@ssw0rd123'
)
- 列出所有用户。
client.list_users()
# 输出:
# ['root', 'user_1']
- 检查特定用户的角色。
client.describe_user(user_name='user_1')
# 输出:
# {'user_name': 'user_1', 'roles': ()}
3. 创建角色
以下示例创建一个名为 roleA
的角色。
client.create_role(
role_name="roleA",
)
创建角色后,您可以:
- 列出所有角色。
client.list_roles()
# 输出:
# ['admin', 'public', 'roleA']
4. 授予角色权限
以下示例演示如何将搜索所有集合的权限授予名为 roleA
的角色。有关您可以授予的其他类型权限,请参阅用户和角色。
在管理角色权限之前,请确保已启用用户认证。否则,可能会出现错误。有关如何启用用户认证的信息,请参阅认证用户访问。
# 授予权限给角色
client.grant_privilege(
role_name='roleA',
object_type='User',
object_name='SelectUser',
privilege='SelectUser'
)
授予角色权限后,您可以:
- 查看授予角色的权限。
client.describe_role(
role_name='roleA'
)
# 输出:
# {'role': 'roleA',
# 'privileges': [{'object_type': 'User',
# 'object_name': 'SelectUser',
# 'db_name': 'default',
# 'role_name': 'roleA',
# 'privilege': 'SelectUser',
# 'grantor_name': 'root'}]}
5. 给用户授予角色
将角色授予用户,以便该用户可以继承角色的所有权限。
# 给用户授予角色
client.grant_role(
user_name='user_1',
role_name='roleA'
)
授予角色后,验证是否已授予:
client.describe_user(
user_name='user_1'
)
# 输出:
# {'user_name': 'user_1', 'roles': ('roleA',)}
6. 撤销权限
执行以下操作时要小心,因为这些操作是不可逆转的。
- 从角色中移除权限。如果撤销了未授予角色的权限,将会出现错误。
client.revoke_privilege(
role_name='roleA',
object_type='User',
object_name='SelectUser',
privilege='SelectUser'
)
- 从用户中移除角色。如果撤销了未授予用户的角色,将会出现错误。
client.revoke_role(
user_name='user_1',
role_name='roleA'
)
- 删除角色。
client.drop_role(role_name='roleA')
- 删除用户。
client.drop_user(user_name='user_1')