权限中心(yidun-union-admin)
回答「谁能做什么、能看哪份数据」,并为全平台提供统一的操作日志。
1. 业务定位
两件事:
- 授权:运营在控制台维护「用户 → 角色 → 功能权限 / URL 权限」以及「用户 → 数据权限」,通过事件中台下发给网关和各业务模块。
- 审计:提供
@OperationLog注解 SDK,各模块埋点后统一落库、统一查询。
两个可部署应用:yidun-union-admin-console-auth(HTTP 控制台,UserAuthApplication)、yidun-union-admin-facade-dubbo-provider(Dubbo 服务,DubboApplication)。
2. 权限模型
| 模型 | 说明 |
|---|---|
union_user / union_role / union_user_role | 老版单角色模型,仍在使用 |
user_role | V2 多角色模型(userName + roleCode) |
function_permission | 功能权限:菜单、按钮等可操作项 |
url_function_permission | URL → 所需功能权限映射,网关据此鉴权 |
app_data_permission | 数据权限:用户在某个 app 某个 category 下可见的数据项 |
data_rule | 旧版数据权限(productNumber / skuCode / strategyCode 维度) |
3. 核心链路
权限数据只经事件下发,各模块不直连权限库。定时对账任务兜底,启动时回补前 12 小时。
4. 操作日志链路
关键点:日志是异步的,切面只负责投递,不阻塞业务;日志查询走 Dubbo 契约 OperateLogFacade。
5. 认证与登录
| 能力 | 实现 |
|---|---|
| 登录认证 | SSO / 本地认证(OnPremAuthenticationProvider) |
| 令牌 | JwtTokenService 签发,网关校验 |
| 验证码 | 登录失败防爆破 |
| 失败锁定 | 连续失败锁定账号 |
| 令牌撤销 | AuthController.logout → Redis 记录,网关可感知 |
| 云鉴同步 | RemoteYunJianService 同步用户信息到网易云鉴 |
6. 存储与中间件
| 组件 | 用途 |
|---|---|
| MySQL | 用户/角色/权限/数据权限/操作日志 |
| Redis | 令牌撤销、验证码、Spring Session、用户偏好 |
| Kafka | 操作日志投递 |
| 事件中台 | 权限数据分发与对账 |
7. 设计模式与扩展点
| 扩展点 | 位置 | 说明 |
|---|---|---|
| 操作日志注解 | @OperationLog + SystemLogAspect | 任意方法加注解即可埋点 |
| 事件类型 | UnionEventDataType | 新增权限数据类型 |
| 数据权限元信息 | yidun-data-permission-meta-dubbo-api | 各业务应用自己实现 DataPermissionMetaService,向控制台提供数据项定义 |
| 缓存同步 | AbstractCacheSyncTask 子类 | 按数据类型对账 |
8. 上下游依赖
| 方向 | 模块 | 说明 |
|---|---|---|
| 上游 | api-gateway | 读功能权限缓存做入口鉴权,依赖本模块签发令牌 |
| 上游 | 所有业务模块 | 内嵌 log-record-client 记录日志 |
| 下游 | mplatform-event | 权限数据分发唯一通道 |
9. 工程约束与变更红线
- 禁用/删除角色会级联禁用其下所有用户,操作前必须确认影响面。
- 权限事件漏发 = 大面积失权或越权,对账任务必须保持运行。
- 日志 SDK 的消息格式不能随便改:几乎所有模块依赖它,改坏会导致全平台审计丢失。
- 数据权限元信息由业务方实现,控制台只消费契约,不要在此硬编码业务数据项。
- 口令摘要用统一工具(
SignIdUtils),禁止自实现。
10. 关键代码索引
| 主题 | 路径 | 说明 |
|---|---|---|
| 用户与角色授权 | yidun-union-admin/service/business/src/main/java/.../service/impl/UserServiceImpl.java | 用户角色联动 |
| 角色状态联动 | yidun-union-admin/service/business/src/main/java/.../service/impl/RoleServiceImpl.java | 删除/禁用级联 |
| 事件下发出口 | yidun-union-admin/console/yidun-union-admin-console-auth/src/main/java/.../permission/task/EventSender.java | 权限事件唯一出口 |
| 缓存对账 | yidun-union-admin/facade/yidun-union-admin-facade-dubbo-provider/src/main/java/.../tasks/cache/ | 定时补推 |
| 操作日志切面 | yidun-union-admin/facade/yidun-union-admin-log-record-client/src/main/java/.../SystemLogAspect.java | 注解解析与投递 |
| 日志落地 | yidun-union-admin/facade/yidun-union-admin-facade-dubbo-provider/src/main/java/.../log/LogKafkaMqReceiver.java | Kafka 消费入库 |
| 登录认证 | yidun-union-admin/console/yidun-union-admin-console-auth/src/main/java/.../controller/AuthController.java | 登入登出 |
| 数据权限 | yidun-union-admin/service/business/src/main/java/.../AppDataPermissionServiceImpl.java | 数据项维护 |
11. 排查要点
| 现象 | 定位 | 结论 |
|---|---|---|
| 用户看不到某个菜单 | 看角色是否绑定功能权限 | 授权未配或未下发 |
| 有菜单但调接口 403 | 看 url_function_permission 映射 | URL 未绑定功能权限 |
| 用户突然失权 | 看角色是否被禁用/删除 | 级联禁用导致 |
| 操作日志缺失 | 看注解是否生效、Kafka 是否堆积 | 切面被绕过或消费异常 |
| 登录频繁失败 | 看失败锁定与验证码 | 触发防爆破策略 |
| 数据权限不生效 | 看业务方是否实现 DataPermissionMetaService | 未实现则控制台无数据项可选 |