账号与权限管理

最近更新时间:2025-04-18 17:58:12

我的收藏

基本介绍

向量数据库通过创建自定义用户,并对用户授权资源对象操作权限,实现细粒度的访问控制与管理。用户(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。
特殊符号包括:下划线(_)、加号(+)、减号(-)、逗号(,)、和号(&)、等号(=)、感叹号(!)、@符号(@)、井号(#)、美元符号($)、百分号(%)、脱字符(^)、星号(*)、圆括号(())、点号(.)。
Python
Java
Go
import tcvectordb
from tcvectordb.model.enum import ReadConsistency
#create a database client object
client = 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)等写入操作。
Python
Java
Go
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())
}

查询用户权限

Python
Java
Go
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 权限。
授权后,如果资源对象被删除,权限不会被撤销。后续如果该资源对象被重新创建,用户依然拥有原本的访问权限。建议用户在删除资源对象后,同时清理对应的访问权限。
Python
Java
Go
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())
}

修改用户密码

Python
Java
Go
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
-