接口权限
接口权限(uri 鉴权)是后端防线:判断"当前用户能不能调这个 uri",防止用户绕过前端页面,直接调用后台接口套取数据。
1. 配置
接口录入在菜单管理页的「关联接口」Tab(mdc_resource_api:uri + requestMethod + resourceId,支持 Ant 通配):
- 扫描绑定(推荐):选在线服务 →调用
GET /{前缀}/anyone/systemApiScan扫描 → 按 Controller 勾选接口 → 保存时调用POST /permission/resourceApi/bind; - 手动录入:接口名/方式/URI(uri必须以
/开头)→POST /permission/resourceApi/save。
一个菜单/按钮可关联多个接口,同资源下 uri+method 幂等去重。删除菜单会级联删除关联接口配置。
两个全局开关(mdp.ignore.*,定义见 md-common-pojo):
| 配置 | 默认 | 说明 |
|---|---|---|
auth-enabled | true | 接口鉴权总开关,false 全部放行 |
not-config-uri-allow | true | 未登记的接口是否放行(联调期 true;上线后严格模式 false) |
gateway-prefix / service-prefixes | api / {console,workbench,open} | 校验时去除的网关前缀与服务前缀 |
2. 授权
无需单独操作
完成功能授权时(角色管理页 → 功能授权 Tab 勾选菜单/按钮)会自动完成接口授权,见菜单和按钮权限 §2。
3. 鉴权
入口:单体版 TokenContextFilter → ApiPermSupport;网关版 GatewayApiPermSupport(共用同一引擎与共享 Redis 缓存)。免鉴权名单(mdp.ignore.anyone/any-user/base-uri)在引擎之前短路。
一次请求依次过 5 道关卡(ApiPermChecker.check),任何一道拒绝即拦截:
① 总开关 auth-enabled=false → 全部放行
② 还原裸路径:剥掉网关前缀(/api)和服务前缀(/console 等)
③ 接口已登记?若接口没有配置在 mdc_resource_api 中(缓存A)
→ 按 not-config-uri-allow 配置的规则统一 放行或拒绝
④ 运营管理员(持启用中 OPERATIONS_ADMIN 角色)→ 直接放行
⑤ 用户 放行集 匹配(缓存B):角色链路反查出的接口集中
任一 ApiPattern(Ant 匹配 + 请求方式匹配,ALL 通配)命中即放行两级缓存(Redis,24h TTL):
| 缓存 | Key | 值 | 失效时机 |
|---|---|---|---|
| A:已登记接口全集 | resource_api_all:id | mdc_resource_api 全部 DISTINCT uri+method | 接口增删/绑定变更 |
| B:用户放行集 | user_resource_api:id:{userId} | UserApiPerm{operationsAdmin, patterns} | 角色授权/停用/删除、用户-角色绑定变更、接口配置变更(按 角色→用户 反查精准失效) |
运营者短路:用户拥有 OPERATIONS_ADMIN 角色,视为拥有一切接口权限且不再查接口表。
4. 示例:「用户管理」的接口权限
配置:菜单管理 →「用户管理」菜单及其按钮的「关联接口」Tab,扫描绑定:
| 挂载资源 | 接口 |
|---|---|
| 用户管理(菜单) | POST /organization/user/page、GET /organization/user/getById |
| user.add(按钮) | POST /organization/user/save |
| user.delete(按钮) | POST /organization/user/delete |
授权:"人事专员"角色功能授权勾选了「用户管理」菜单和 user:edit,未勾 user:add/user:delete。
鉴权效果:
- 该角色用户调
POST /organization/user/page→ 关卡③命中已登记 → 关卡⑤放行集含该接口 → 放行; - 调
POST /organization/user/save→ 已登记但放行集不含 → 拒绝(ArgumentException); - 调某个未登记的新接口 → 关卡③按
not-config-uri-allow决定(默认放行); - 运营管理员调任何接口 → 关卡④直接放行。
5. 排障速查
| 现象 | 排查 |
|---|---|
| 接口提示无权限 | 接口是否录入 resource_api → 录入的资源是否授权给角色 → 用户放行集缓存是否已失效(改授权后依赖失效链路,可等 TTL 或检查 console 失效日志) |
| 所有接口都不鉴权 | mdp.ignore.auth-enabled 是否被关;路径是否命中 anyone/any-user 免鉴权名单 |
| 新接口默认可调 | not-config-uri-allow=true(默认联调放行);上线白名单模式改 false |
| 网关版不生效 | 请求路径前缀是否匹配 gateway-prefix/service-prefixes 归一化规则 |