用户与权限
用户管理、角色与 RBAC 权限体系
这一篇讲租户内部的用户与权限。这里的「用户」指工作台的使用者,不是站点会员——两者的 区别见 会员系统。
用户管理
管理后台 → 用户:
- 创建用户(用户名 + 初始密码)
- 编辑资料、启用 / 停用、重置密码
- 分配角色
用户登录后进入 /app/*,能看到哪些模块由权限决定。
权限怎么算出来的
权限有两条来源,只有两条:
- 系统管理员标记:勾了这个标记的用户,直接拥有本租户的全部权限,不需要分配任何 角色。每个租户至少要有一个,否则没人能授权别人。
- 角色:其余用户的权限完全来自分配到的角色。没有角色 = 没有任何权限。
新租户不会预置角色——预置的「编辑者」在每家的含义都不一样,与其猜,不如让第一位管理 员按自己的分工建。
权限命名
权限按 <模块>.<动作> 命名,由各模块自己声明并汇总成权限目录:
| 权限 | 含义 |
|---|---|
site.read |
查看站点内容 |
site.write |
编辑站点内容 |
user.manage |
管理用户 |
role.manage |
管理角色 |
audit.read |
查看审计日志 |
只有权限目录里存在的键才生效——手写一个不存在的权限不会报错,但也永远不会命中, 所以建角色时从目录里勾,别手打。
角色管理
管理后台 → 角色:查看权限目录、建角色并勾权限、改权限、删角色(已分配出去的要先 解绑)。
权限检查
前端:
const { hasPermission } = usePermissions();
if (hasPermission("site.write")) {
// 显示编辑按钮
}
无权限的入口直接不渲染,不是置灰——一个点不动的按钮只会让人反复来问为什么。
后端:
app.get("/api/site/docs", { preHandler: [app.requirePermission("site.read")] }, handler);
后端校验是唯一真正生效的那道:前端隐藏 UI 只是体验,任何人都能直接调接口。
审计日志
所有写操作都记审计:谁、什么时候、对哪个资源、做了什么。在管理后台的审计日志里按 模块、动作、时间筛选。
新模块的写操作也要记——这是模块契约校验的检查项之一,漏了 check:modules 会报错。
与会员的区别
| 用户(User) | 会员(Member) | |
|---|---|---|
| 是谁 | 站点运营者 | 站点访客 |
| 入口 | /app/* |
/member/* |
| 权限 | RBAC 角色权限 | 有 / 无会员身份 |
| 在哪管 | 管理后台 → 用户 | 站点管理 → 站点会员 |