4. 权限领域模型设计:用户、角色、权限(资源+操作)的实体与关系建模
权限领域模型是权限审计网关的核心数据骨架。本章从实体定义、关系约束、模型演进三个层次,构建一套可落地的 RBAC(Role-Based Access Control)扩展模型,明确用户、角色、权限(资源+操作)之间的静态结构与动态规则。
4.1 核心实体定义
权限模型包含四个基础实体:用户(User)、角色(Role)、资源(Resource)、操作(Action)。其中权限(Permission)是资源与操作的组合,不单独作为持久化实体,而是通过关联表表达。
| 实体 | 业务含义 | 关键属性示例 |
|---|---|---|
| User | 系统访问主体,可以是人、服务账号或设备 | user_id, username, department, status |
| Role | 权限集合的逻辑分组,代表一类职责 | role_id, role_name, role_type, description |
| Resource | 被保护的资产,如 API、页面、数据域 | resource_id, resource_name, resource_type, parent_id |
| Action | 对资源可执行的操作,如读、写、删除 | action_id, action_name, action_code |
设计要点:资源采用树形结构(parent_id)支持层级继承;操作使用 action_code 枚举值(如 "read", "write", "delete"),便于策略引擎匹配。
4.2 实体关系建模
实体间通过五张关联表实现多对多关系,形成完整的权限图谱:
- User ↔ Role:多对多。一个用户可拥有多个角色,一个角色可授予多个用户。
- Role ↔ Permission:多对多。一个角色包含多个权限,一个权限可被多个角色引用。
- Permission = Resource + Action:权限是资源与操作的笛卡尔积子集,通过关联表记录允许的组合。
- Resource ↔ Resource:自引用一对多。资源树通过 parent_id 实现层级继承。
- User ↔ Permission(可选):直接授权,用于临时或例外场景,优先级高于角色继承。
关系约束:权限审计网关要求所有权限判定必须经过角色层,直接用户-权限绑定仅作为审计例外通道,且必须在审计日志中标记为“直接授权”。
4.3 领域模型结构图
下图展示核心实体及其关联关系,采用 ER 图风格,突出主键、外键与关系基数。
4.4 关系基数与约束
下表列出各关联关系的基数约束与业务含义,是数据库建表与 ORM 映射的依据:
| 关联 | 基数 | 业务约束 |
|---|---|---|
| User ↔ UserRole | 1:N | 一个用户可关联多个角色,删除用户时级联删除关联 |
| Role ↔ UserRole | 1:N | 一个角色可被多个用户持有,删除角色时级联删除关联 |
| Role ↔ RolePerm | 1:N | 一个角色可包含多个权限,删除角色时级联删除关联 |
| Permission ↔ RolePerm | 1:N | 一个权限可被多个角色引用,删除权限时级联删除关联 |
| Resource ↔ ResAction | 1:N | 一个资源可绑定多个操作,删除资源时级联删除关联 |
| Action ↔ ResAction | 1:N | 一个操作可被多个资源引用,删除操作时级联删除关联 |
| Resource ↔ Resource | 1:N (自引用) | parent_id 允许为空,根节点 parent_id = NULL |
4.5 权限判定流程
在网关运行时,权限判定遵循以下步骤,确保每次请求都能回溯到角色与权限组合:
- 身份解析:从请求中提取用户身份(JWT / API Key),获取 user_id。
- 角色加载:通过 UserRole 关联表查询用户拥有的所有角色列表。
- 权限聚合:遍历角色列表,通过 RolePerm 关联表聚合所有权限 ID。
- 资源匹配:解析请求目标资源(如 API 路径),匹配资源树节点。
- 操作校验:检查请求方法(GET/POST/PUT/DELETE)是否在 ResAction 关联表中与目标资源组合。
- 决策输出:若权限 ID 集合包含当前资源+操作组合,则允许;否则拒绝并记录审计日志。
审计关注点:步骤 2 中若用户同时拥有多个角色,需注意权限合并时的冲突处理。本模型采用“允许优先”策略——只要任一角色包含该权限,即判定通过。所有判定结果必须写入审计日志,包含 user_id、role_id 列表、resource_id、action_id、判定结果、时间戳。
4.6 模型演进与扩展
基础 RBAC 模型在实际网关中需要扩展以下能力:
- 角色继承:支持角色层级(parent_role_id),子角色自动继承父角色权限。
- 资源域隔离:引入 domain 字段,将资源与操作限定在特定业务域内,避免跨域越权。
- 临时授权:在 UserRole 表中增加有效期字段(start_time, end_time),支持限时角色授予。
- 条件权限:在 Permission 实体中增加 condition 字段(JSON 格式),存储 IP 范围、时间窗口等动态约束。
扩展后的模型仍保持核心实体不变,仅通过新增字段或关联表实现,确保审计链路可追溯。