# 5.4 权限管理(RBAC)
:::tip 概述
经典三级模型:用户-角色-菜单(权限节点)。角色携带数据范围档位,多角色用户取最宽松。接口级校验在 Authz 中间件(元数据驱动),按钮级在前端 v-permission。
:::
## 模型
```text
gin_user ──< gin_user_role >── gin_role ──< gin_role_menu >── gin_menu
│
└── data_scope 数据范围档位(1 全部 / 2 本部门及以下 / 3 本部门 / 4 仅本人)
```
菜单 `type` 区分页面菜单(0)与纯权限节点(1);`permission` 列承载权限码(`sys:user:add` 形态)。
## 身份装配(LoadIdentity)
登录后经 IdentityLoader 装配(结果缓存 300 秒):
| 输出 | 内容 |
|---|---|
| 角色编码集合 | 用于超管判定等 |
| 权限节点集合 | Authz 比对依据 |
| 数据范围 | 多角色取最宽松档位 |
| deptID | DataScope 行级过滤用 |
重新授权后权限缓存最长 300 秒生效,**重新登录立即生效**。
## 接口级校验(Authz 中间件)
```text
免登录 → 放行
元数据未命中 / Permission 为空 → 登录即可,放行
超管角色 → 直通
权限节点集合命中 → 放行
否则 → 403 信封 + 拒绝原因(不产生操作日志,metrics 归类 denied)
```
边界:Authz 只管**功能权限**(能不能访问这个接口);**数据权限**(能看哪些行)在 repository 层 applyFilters 链实现,两者不混。
## 按钮级(前端 v-perm / v-perms)
```html
新增
操作
```
菜单接口下发的权限集合驱动指令显隐,超管通配码 `*:*:*` 直通。注意:前端隐藏只是体验,安全边界始终在后端 Authz。
## 超管语义
- 租户ID=0(平台级):不过滤租户数据,Authz 直通
- 普通管理员:授权多少权限码就能调多少接口
## 权限配置操作
1. 菜单管理:为模块/按钮建节点,填 permission 码
2. 角色管理:勾选节点保存(写 gin_role_menu)
3. 用户管理:分配角色
三处权限码必须与 RouteSpec 声明逐字一致(见 [3.9 权限节点配置](/zh/guide/permission.html))。
## 数据范围档位
| 档位 | 行级条件 |
|---|---|
| 1 全部 | 租户隔离之内不过滤 |
| 2 本部门及以下 | dept_id IN(自身部门 + 全部子孙) |
| 3 本部门 | dept_id = 自身部门 |
| 4 仅本人 | id = 自身用户 ID |
详见 [5.10 数据权限](/zh/core/data-scope.html)。
## 下一步
→ [5.5 跨域配置(CORS)](/zh/core/cors.html)