权限审计

MOI SDK 通过角色管理全局权限码和对象级权限,并提供用户、角色变更日志。权限码是稳定 的程序化标识,例如 DC2 表示查询 Catalog、DT8 表示查询表数据;界面名称和权限码 的完整对应关系见AI Studio 权限点矩阵

角色与权限方法

目标

Python

Go

创建、读取、列出或删除角色

create_roleget_rolelist_rolesdelete_role

CreateRoleGetRoleListRolesDeleteRole

更新角色权限和描述

update_role_info

UpdateRoleInfo

更新指定对象/类型的权限码

update_role_code_list

UpdateRoleCodeList

启用或禁用角色

update_role_status

UpdateRoleStatus

查看对象关联的角色

list_roles_by_category_and_object

ListRolesByCategoryAndObject

批量更新某个对象关联的角色

update_roles_by_object

UpdateRolesByObject

列出可授权对象

list_objects_by_category

ListObjectsByCategory

Python SDKClient 还提供 create_table_roleupdate_table_roledelete_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_listobj_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

覆盖内容

用户日志

list_user_logs(request)

ListUserLogs(ctx, req)

用户创建、更新、删除、角色分配等

角色日志

list_role_logs(request)

ListRoleLogs(ctx, req)

角色创建、更新、删除、权限变更等

两者都使用分页和过滤结构。返回条目包括操作类型、用户名、角色名、创建时间、状态和描述:

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、密码或完整敏感响应写入日志。

角色配置的产品说明见角色权限,控制台操作 日志的范围见操作日志