启用 RBAC
通过启用 RBAC,可以根据用户角色和权限控制对特定 Milvus 资源(如 Collections 或分区)或权限的访问。目前,该功能仅在 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', # replace with your own Milvus server address
token='root:Milvus' # replace with your own Milvus server 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()
# output:
# ['root', 'user_1']
- 检查某个用户的角色。
client.describe_user(user_name='user_1')
# output:
# {'user_name': 'user_1', 'roles': ()}
3.创建角色
下面的示例创建了一个名为roleA
的角色。
client.create_role(
role_name="roleA",
)
创建角色后,您可以
- 列出所有角色。
client.list_roles()
# output:
# ['admin', 'public', 'roleA']
4.向角色授予权限
下面的示例演示了如何向名为roleA
的角色授予搜索所有 Collections 的权限。
object_type
指定对象类型,也可以理解为资源类型。目前,有效值包括 Collections/User/Global 等,其中 Global 表示没有特定的资源类型。object_name
是资源名称。如果 objecttype为 Collection,那么 object name 可以指特定的 Collections 名称,也可以使用 * 来指定所有 Collections。如果对象类型为全局,则只能用 * 指定对象名称。有关可以授予的其他权限类型,请参阅用户和角色。
在管理角色权限之前,请确保已启用用户身份验证。否则可能会出错。有关如何启用用户身份验证的信息,请参阅验证用户访问。
# grant privilege to a role
client.grant_privilege(
role_name='roleA',
object_type='User', # value here can be Global, Collection or User, object type also depends on the API defined in privilegeName
object_name='user_1', # value here can be * or a specific user name if object type is 'User'
privilege='SelectUser'
)
向角色授予权限后,您可以
- 查看授予角色的权限。
client.describe_role(
role_name='roleA'
)
# output:
# {'role': 'roleA',
# 'privileges': [{'object_type': 'User',
# 'object_name': 'user_1',
# 'db_name': 'default',
# 'role_name': 'roleA',
# 'privilege': 'SelectUser',
# 'grantor_name': 'root'}]}
5.向用户授予角色
将角色授予一个用户,使该用户可以继承该角色的所有权限。
# grant a role to a user
client.grant_role(
user_name='user_1',
role_name='roleA'
)
授予角色后,验证角色是否已授予:
client.describe_user(
user_name='user_1'
)
# output:
# {'user_name': 'user_1', 'roles': ('roleA')}
6.撤销权限
执行以下操作时要谨慎,因为这些操作是不可逆的。
- 从角色中删除权限。如果撤销的权限尚未授予角色,则会出现错误。
client.revoke_privilege(
role_name='roleA',
object_type='User', # value here can be Global, Collection or User, object type also depends on the API defined in privilegeName
object_name='user_1', # value here can be * or a specific user name if object type is 'User'
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')