账号、角色与统一授权
Modu 采用用户—角色—权限模型:角色只承载身份与成员关系,实际功能访问由**能力(capability)**决定,菜单按当前主体被授予的能力生成导航。能看到页面或按钮,不代表能读写全部记录;授权精确到能力、数据范围、条件与有效期。
统一授权入口
Section titled “统一授权入口”授权管理只有一个入口:授权控制台 /system/authorization,提供六个页签。
| 页签 | 用途 |
|---|---|
| 能力目录 | 按资源分组树形展示全部能力,如「系统管理 / 授权管理」「示例 / 货币」「示例 / 报销」 |
| 配置授权 | 以双向穿梭框批量授予或回收业务能力,支持启停状态的能力绑定 |
| 查看用户授权 | 查看单个用户的授权投影 |
| 权限模拟 | 以指定主体的视角预授权限结果 |
| 管理委托 | 配置授权维护者及其可授予的范围上限 |
| 变更审计 | 按操作者、对象、能力、动作、时间范围查询授权变更 |
普通用户可在个人「受限授权」工作台 /account/authorization(头像菜单入口)查看和维护自己被委托范围内的授权。
每条 Grant 记录包含能力、数据范围、条件与有效期;授权数据源唯一,服务端在每次请求时按当前主体重新鉴权。前端隐藏按钮只用于引导用户,服务端仍会重新核对当前授权。
先建立部门与账号,再配置角色。角色页仅管理身份与成员关系,并跳转到统一授权控制台完成能力配置。
角色分配与密码管理都是独立能力:
- 给用户分配角色需要
system:user:assign-roles,且只能分配白名单内的目标用户与角色。 - 重置密码是独立能力
system:user:reset-password,对应接口PUT /users/{id}/password。
用户邮箱为非必填,新增手机号字段,账号可用手机号标识。
用户数据权限
Section titled “用户数据权限”数据权限不再有全局的数据范围开关,而是拆分为精确的业务能力。例如:
- 核心用户读取是独立能力,授予后才能查看用户列表与详情。
- 示例插件的货币参考(
currency:reference)与报销的创建、读取、审批能力各自独立授予。
Agent 查询与业务列表都按当前主体的授权过滤;授权查询投影即强制边界,未授予的能力既不出现在导航中,也不会放行对应接口。内部 DataScope 是单个能力授权计划(Plan)的投影,不是全局角色范围,也不是独立的授权引擎。
维护者可将部分授权职责委托给管理者,并精确约束:接收者、可授予的能力、范围上限、允许的动作(授予、变更、回收)与期限。委托关系的变更会重新鉴权并写入审计。
应用与扩展的授权声明
Section titled “应用与扩展的授权声明”应用和扩展通过 bootstrap.Options.Authorization 与 AuthorizationDefaults 声明资源、能力、来源与默认安装。应用侧在 server 目录维护授权命令:
go run ./cmd/modu authorization install --maintainers <用户ID>go run ./cmd/modu authorization cataloggo run ./cmd/modu authorization availabilitygo run ./cmd/modu authorization maintainersgo run ./cmd/modu authorization set-availability应用菜单和扩展能力参与安装期的授权事务。重跑安装不会恢复维护者已撤销的授权,也不会擅自恢复已停用的能力绑定。
旧授权 schema(0.11 及更早,含 RBAC 数据范围模型)不支持就地转换;升级必须在新库中显式安装授权并重新授权。迁移步骤见核心升级。
实现自己的业务接口与授权声明,继续阅读后端业务开发。