基本介绍
向量数据库通过创建自定义用户,并对用户授权资源对象操作权限,实现细粒度的访问控制与管理。用户(User)、资源对象(Resource)和操作(Action)权限构成了访问控制的基础框架,确保数据的安全性和合理使用。
说明:
当前的账号权限管理功能仅适用于 Base 类数据库和集合(collection),而不涉及 AI 套件类数据库和集合视图(collectionView)。即对于 AI 类数据库和 CollectionView,仅支持使用 root 用户进行访问,并拥有完全读写权限,其他自定义用户均无法访问。
类别 | | 功能 | SDK |
用户(User) | | 指数据库系统的使用者,即需要访问和操作数据库中数据的人员或程序。 root 用户:创建数据库实例时,默认创建的用户,具有最高权限的超级用户,无法被任何账号(包括其自身)删除或修改其权限。 自定义用户:通过 API 接口,使用 root 权限创建的新用户,并分配特定资源操作权限,实现精细化访问控制。 | |
权限(Privilege) | 资源对象(Resource) | 指数据库中用户权限生效的数据实体,向量数据库可授权的资源对象包括三个层级: Global:对实例下的所有 DB 和 Collection 对象授权。 Database 层级:对具体某一个 Database 授权。 Collection 层级:对具体某一个特定的 Collection 单独授权。 | |
| 操作权限(Action) | 定义用户对资源对象可执行的操作权限。目前可分配的操作规则如下(暂不支持授权接口级别的操作): dbAdmin:允许执行创建(create)、删除(drop)、清空(truncate)等数据定义语言(DDL)操作。 read:仅限于执行查询(query)和搜索(search)等读取操作,禁止进行任何数据修改。 readWrite:允许执行查询(query)、搜索(search)等读取操作,以及插入(upsert)、更新(update)等写入操作。 | |
创建用户
创建自定义用户,需指定用户名及其对应的密码,如下以 Python 为例,说明用户名与密码的配置规则。
参数名 | 参数含义 | 参数配置 |
user | 自定义用户名 | 长度要求:1~32字符。 字符类型要求:只能使用英文字母(大写 A~Z、小写 a~z)、数字(0~9)、下划线(_),并以英文字母开头。 |
password | 设置密码 | 密码长度要求:8~128字符。 密码设置支持如下类型的任意组合。 字母:大写 A~Z、小写 a~z。 数字:0~9。 特殊符号包括:下划线(_)、加号(+)、减号(-)、逗号(,)、和号(&)、等号(=)、感叹号(!)、@符号(@)、井号(#)、美元符号($)、百分号(%)、脱字符(^)、星号(*)、圆括号(())、点号(.)。 |
import tcvectordbfrom tcvectordb.model.enum import ReadConsistency#create a database client objectclient = tcvectordb.RPCVectorDBClient(url='http://10.0.X.X:80', username='root', key='eC4bLRy2va******************************', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)# 创建用户res = client.create_user(user='app_user', password='********')print(res)
import com.tencent.tcvectordb.client.VectorDBClient;import com.tencent.tcvectordb.model.param.database.ConnectParam;import com.tencent.tcvectordb.model.param.entity.BaseRes;import com.tencent.tcvectordb.model.param.enums.ReadConsistencyEnum;import com.tencent.tcvectordb.model.param.user.*;import com.tencent.tcvectordb.utils.JsonUtils;// client 为 VectorDBClient() 创建的客户端对象BaseRes res = client.createUser("app_user", "********");System.out.println("create user res: code:" + res.getCode() + ", msg: " + res.getMsg());
import ("context""log""github.com/tencent/vectordatabase-sdk-go/tcvectordb""github.com/tencent/vectordatabase-sdk-go/tcvectordb/api/user")var (ctx = context.Background()database = "db-test"database1 = "db-test1"collectionName = "book-vector")err := client.CreateUser(ctx, tcvectordb.CreateUserParams{User: "app_user", Password: "**********"})if err != nil {log.Printf("create user failed, err: %+v", err.Error())}
给用户授权
给用户授权时,需指定用户名及权限,可以给用户批量授予多组权限;每个权限中,需要指定资源对象和允许的操作。如下以 Python 接口的参数为例,说明配置权限的具体规则。
参数名 | 参数含义 | 子参数 | 参数配置 |
user | 自定义用户名 | - | - |
privileges | 对用户授予的权限列表,可以配置多条权限 | resource | 指定用户可操作的资源对象,分为如下三个层级。 全局:对实例下的所有 DB 和 Collection 对象授权。配置方式: "resource": "*.*" 。 DB 层级:对某个 DB 授权,包括该 DB 下的所有 Collection。配置方式: "resource": "db0.*", 其中,db0 指授权的数据库名。 Collection 层级:对某个特定集合授权,配置方式: "resource": "db0.test_coll" 其中,db0 指授权的数据库名,test_coll 为授权的集合名。说明: resource 只能指向已存在的资源;若指定的资源不存在,则触发错误提示信息。 |
| | actions | 配置资源对象允许操作的权限。 dbAdmin:允许执行创建(create)、删除(drop)、清空(truncate)等数据定义语言(DDL)操作。 read:仅限于执行查询(query)和搜索(search)等读取操作,禁止进行任何数据修改。 readWrite:允许执行查询(query)、搜索(search)等读取操作,以及插入(upsert)、更新(update)等写入操作。 |
res = client.grant_to_user(user='app_user',privileges=[{"resource": "db0.*","actions": ["read"]},{"resource": "db1.book-vector","actions": ["readWrite"]}])print(res)
// client 为 VectorDBClient() 创建的客户端对象BaseRes res = client.grantToUser(UserGrantParam.newBuilder().withUser("app_user").withPrivileges(Arrays.asList(PrivilegeParam.newBuilder().withResource("db-test.*").withActions(Arrays.asList("read")).build(),PrivilegeParam.newBuilder().withResource("db-test1.*").withActions(Arrays.asList("dbAdmin")).build(),PrivilegeParam.newBuilder().withResource("db-test.book-vector").withActions(Arrays.asList("readWrite")).build())).build());System.out.println("grant user permission res: code:" + res.getCode() + ", msg: " + res.getMsg());
err := client.GrantToUser(ctx, tcvectordb.GrantToUserParams{User: "app_user",Privileges: []*user.Privilege{{Resource: database + ".*",Actions: []string{"read"},},{Resource: database + "." + collectionName,Actions: []string{"readWrite"},},{Resource: database1 + ".*",Actions: []string{"dbAdmin"},},}})if err != nil {log.Printf("grant to user failed, err: %+v", err.Error())}
查询用户权限
res = client.describe_user(user='app_user')print(res)
// client 为 VectorDBClient() 创建的客户端对象UserDescribeRes userDescribeRes = client.describeUser("app_user");System.out.println("describe user res: " + userDescribeRes.toString());
result, err := client.DescribeUser(ctx, tcvectordb.DescribeUserParams{User: "app_user"})if err != nil {panic(err)}log.Printf("DescribeUser Result: %+v", result)
回收用户权限
回收用户权限,需明确指出回收权限的具体用户,列出需要回收的具体权限。
说明:
root 用户为数据库的默认用户,享有最高权限级别,无法被任何账号(包括其自身)撤销。
撤销权限时,权限需要和授予时完全对应,包括资源对象和允许的操作,都需要保持一致。
只能针对原本层级回收权限,不能单独回收子对象的权限。例如,用户拥有 *.* 下的权限,那么不能单独回收 db.* 或者 db.coll 的权限。
只能回收授予时指定的 action。例如,用户拥有某个资源对象的 readWrite 权限,那么回收时不能单独回收其 read 权限。
授权后,如果资源对象被删除,权限不会被撤销。后续如果该资源对象被重新创建,用户依然拥有原本的访问权限。建议用户在删除资源对象后,同时清理对应的访问权限。
res = client.revoke_from_user(user='app_user',privileges={"resource": "db0.*","actions": ["read"]})print(res)
BaseRes res = client.revokeFromUser(UserRevokeParam.newBuilder().withUser("app_user").withPrivilege(PrivilegeParam.newBuilder().withResource("db-test.*").withActions(Arrays.asList("read")).build()).build());System.out.println("revoke user permission res: code:" + res.getCode() + ", msg: " + res.getMsg());
err := client.RevokeFromUser(ctx, tcvectordb.RevokeFromUserParams{User: "app_user",Privileges: []*user.Privilege{{Resource: database + ".*",Actions: []string{"read"},},}})if err != nil {log.Printf("create user failed, err: %+v", err.Error())}
修改用户密码
res = client.change_password(user='app_user', password='########')print(res)
// client 为 VectorDBClient() 创建的客户端对象BaseRes res = client.changePassword("app_user", "##########");System.out.println("change user password res: " + res.getCode() + " " + res.getMsg());
err := client.ChangePassword(ctx, tcvectordb.ChangePasswordParams{User: "app_user",Password: "########",})if err != nil {log.Printf("change user password err: %+v", err.Error())}
API 资源层级与操作权限
向量数据库提供的操作规则(read、readWrite 等)和 API 接口的对应关系,如下表所示。
API 接口 | dbAdmin | read | readWrite |
/database/create | ✅ | - | - |
/database/drop | ✅ | - | - |
/database/list | ✅ | ✅ | ✅ |
/collection/create | ✅ | - | - |
/collection/drop | ✅ | - | - |
/collection/truncate | ✅ | - | - |
/collection/list | ✅ | ✅ | ✅ |
/collection/describe | ✅ | ✅ | ✅ |
/index/rebuild | - | - | ✅ |
/index/modifyVectorIndex | - | - | ✅ |
/index/add | - | - | ✅ |
/index/drop | - | - | ✅ |
/alias/set | - | - | ✅ |
/alias/delete | - | - | ✅ |
/document/query | - | ✅ | ✅ |
/document/search | - | ✅ | ✅ |
/document/hybridSearch | - | ✅ | ✅ |
/document/keywordSearch | - | ✅ | ✅ |
/document/update | - | - | ✅ |
/document/delete | - | - | ✅ |
/document/upsert | - | - | ✅ |
/document/count | - | ✅ | ✅ |