角色与权限(RBAC)
2026/10/26大约 2 分钟
角色与权限(RBAC)
模型是"用户 → 角色 → 菜单/权限点"。角色管理在 RoleController.php(前缀 /sys/role,slug 形如 system:role:*),数据权限在 UserController 与行级断言里落地。
角色管理
/sys/role 提供标准 CRUD + changeStatus,以及:
| 方法 | 作用 |
|---|---|
getAllRoles | 取全部角色(下拉/分配用) |
getPermissions / setPermissions | 读取、保存角色的菜单与权限点勾选 |
accessRole | 可分配给当前操作者的角色集合(按级别收敛) |
getUsers | 角色下的成员 |
给角色授权就是勾选它可见的菜单 + 按钮级权限点(slug),保存后即时影响这些角色下用户的鉴权结果。
功能权限校验
- 后端:
AuthCheck校验登录态 +#[Permission(slug)]判角色是否含该 slug。 - 前端:
v-auth="'system:{module}:{action}'"控制按钮显隐。 - 三者(
v-auth值、Permission的 slug、菜单登记的权限点)必须一致。规则见权限控制规范。
数据权限(行级)
功能权限管"能不能用这个功能",数据权限管"能看到/改哪些行":
currentLevel():用户所有角色的最大行政级别,超管PHP_INT_MAX。currentDataScope():DataScopeService::resolve()得出{all, self, dept_ids},列表查询据此过滤。assertCanManage($level)/assertRowVisible():操作/查看单行前断言。
部门归属由 UserController::setDepts 维护,组织架构见组织架构与用户。
超管与便捷标记
id===1 为超级管理员,拥全部权限、不受 #[Permission] 限制。JWT 里的 is_admin 只是便捷标记,代码不要仅凭它放行,权威判定查库。
变更即清缓存
改角色、分配菜单/权限后清缓存,否则新权限不生效:UserInfoCache::clearByRole()、UserAuthCache::clearByRole()、UserMenuCache::clear()。见缓存规范。
关联接口
| 前缀 | 控制器 | 关键方法 |
|---|---|---|
/sys/role | RoleController | CRUD、getPermissions/setPermissions、accessRole、getUsers |
/sys/user | UserController | setDepts、batchSet、editPass、changeStatus |
