权限审计¶
MOI SDK 通过角色管理全局权限码和对象级权限,并提供用户、角色变更日志。权限码是稳定
的程序化标识,例如 DC2 表示查询 Catalog、DT8 表示查询表数据;界面名称和权限码
的完整对应关系见AI Studio 权限点矩阵。
角色与权限方法¶
目标 |
Python |
Go |
|---|---|---|
创建、读取、列出或删除角色 |
|
|
更新角色权限和描述 |
|
|
更新指定对象/类型的权限码 |
|
|
启用或禁用角色 |
|
|
查看对象关联的角色 |
|
|
批量更新某个对象关联的角色 |
|
|
列出可授权对象 |
|
|
Python SDKClient 还提供 create_table_role、update_table_role 和 delete_table_role
等表权限辅助方法;它们封装了多步角色操作。一般角色和其他对象权限仍使用 RawClient。
读取角色¶
先读取现有角色和权限,再决定是否变更:
roles = client.list_roles(
{
"keyword": "reader",
"common_condition": {
"page": 1,
"page_size": 50,
"filters": [],
},
}
)
for role in roles["role_list"]:
print(role["id"], role["name"], role["status"])
roles, err := client.ListRoles(ctx, &sdk.RoleListRequest{
Keyword: "reader",
CommonCondition: sdk.CommonCondition{
Page: 1,
PageSize: 50,
Filters: []sdk.CommonFilter{},
},
})
if err != nil {
return err
}
for _, role := range roles.List {
fmt.Println(role.RoleID, role.RoleName, role.Status)
}
get_role / GetRole 返回全局 authority_list 和对象级 obj_authority_list。创建或
更新角色时,对应请求字段是 authority_code_list 和 obj_authority_code_list。
全局权限与对象权限¶
全局权限直接使用权限码列表。下面创建一个只带全局读取权限的角色:
created = client.create_role(
{
"name": "catalog_reader",
"description": "Can list catalogs",
"authority_code_list": ["DC2"],
"obj_authority_code_list": [],
}
)
对象权限还需要对象 ID、类别和每个权限码的可选规则。对象 ID 和 category 应来自
服务端,可以先调用 list_objects_by_category({"category": "catalog"}) 查找可授权对象。
不要从对象名称推导 ID。
当前 Python 集成测试与 Go 强类型模型对嵌套对象 ID 和类别使用了不同的 JSON 字段名。 在两个 SDK 的版本完成统一之前,应使用已安装版本附带的请求模型与测试,不要跨语言复制 对象权限载荷。
update_role_info / UpdateRoleInfo 接收完整的全局和对象权限列表。用旧快照更新可能覆盖
其他管理员的修改,因此写入前应重新读取角色,合并期望状态,再验证写入后的详情。
AI Studio Workspace 角色与 MatrixOne 数据库角色相互独立。权限码不能替代 SQL GRANT,
数据库授权也不会增加 Catalog Service 权限。
用户和角色日志¶
SDK 提供两类管理日志:
日志 |
Python |
Go |
覆盖内容 |
|---|---|---|---|
用户日志 |
|
|
用户创建、更新、删除、角色分配等 |
角色日志 |
|
|
角色创建、更新、删除、权限变更等 |
两者都使用分页和过滤结构。返回条目包括操作类型、用户名、角色名、创建时间、状态和描述:
logs = client.list_role_logs(
{
"keyword": "",
"common_condition": {
"page": 1,
"page_size": 50,
"filters": [],
},
}
)
这些接口是用户和角色管理日志,不是所有 Catalog 请求的通用审计流。AI Studio 控制台 中的操作日志还可展示当前登录用户请求的方法、路径、状态码和 Request ID;公开 SDK 当前没有对应的通用操作日志方法。
关联请求和错误¶
两个 SDK 都支持为单次调用设置 X-Request-ID:
from moi.options import with_request_id
client.get_role(
{"id": 401},
with_request_id("iam-read-role-401"),
)
role, err := client.GetRole(
ctx,
&sdk.RoleInfoRequest{RoleID: 401},
sdk.WithRequestID("iam-read-role-401"),
)
服务端业务错误在 Python 中是 APIError,在 Go 中是 *sdk.APIError,包含 Code、
消息、Request ID 和 HTTP 状态。无法解析为业务信封的非 2xx 响应使用 HTTPError。
记录 Request ID 和非敏感对象 ID 即可,不要把 API Key、密码或完整敏感响应写入日志。