From 966ef66b08625a7adffdf901521997a9c49a54a9 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Fri, 28 Aug 2026 15:34:36 +0800 Subject: [PATCH] =?UTF-8?q?docs(arch):=20=E5=90=8C=E6=AD=A5UserRole/?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E4=BD=9C=E7=94=A8=E5=9F=9F=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E6=8F=8F=E8=BF=B0=EF=BC=88=E5=85=B3=E8=81=94?= =?UTF-8?q?=E8=A1=A8=E4=B8=BA=E5=87=86=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UserRole遗留字段(DeptUUID/WorkgroupUUID/RoleType)已删除,部门/工作组归属与成员类型全走关联表 --- SAAS_ARCHITECTURE.md | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/SAAS_ARCHITECTURE.md b/SAAS_ARCHITECTURE.md index 9fe3a0b9..6fced58b 100644 --- a/SAAS_ARCHITECTURE.md +++ b/SAAS_ARCHITECTURE.md @@ -104,7 +104,7 @@ | **用户** | `User` / `UserAvatar` / `User2FA` / `UserPending2FA` / `UserLoginLog` / `AccountActivation` / `Password` / `UserIDCard` | 用户身份与认证 | | **角色权限** | `Role` / `Permission` / `UserRole` / `RolePermission` | RBAC 核心 | | **岗位模板** | `PositionTemplate` / `PositionTemplatePermission` | 权限初始化快照 | -| **人事标签** | `Position` / `UserDept` | 职务标签(与权限解耦) | +| **人事标签** | `Position` | 职务标签(与权限解耦) | | **商铺** | `Shop` / `RoleShop` | 多商铺体系 | | **ABAC** | `UserABAC` | 属性访问控制(补充) | | **审计** | `AuditLog` / `AbnormalUserLog` | 操作审计 + 攻击溯源 | @@ -113,7 +113,7 @@ #### (1) Position 与权限**完全解耦** - 人事职务标签(`Position`)仅用于人事管理,**不直接绑定权限** -- 调岗/升职只修改 `UserDept.PositionUUID` 与 `UserRole`,权限只通过 `UserRole → RolePermission → Permission` 走 +- 调岗/升职只修改 `Position`,权限只通过 `UserRole → RolePermission → Permission` 走 - 规避了业界常见错误:把职务直接绑权限导致调岗时权限树重算 #### (2) PositionTemplate 的"快照复制"机制 @@ -121,22 +121,25 @@ - 模板调整只影响**之后新建**的角色,已有角色不被动变更 - 避免了"模板改一个字段,全员权限突然变了"的运维灾难 -#### (3) UserRole 作为**胖关联表** -`UserRole` 表同时承载三重语义: -- **权限分配**:User ↔ Role 多对多 -- **组织归属**:携带 `CompanyUUID / DeptUUID / WorkgroupUUID` -- **数据范围**:`RoleType` 标识"普通成员/部门负责人" +#### (3) UserRole 实体化 + 关联表(部门/工作组多对多) +`UserRole` 是"用户↔角色"的**实体化中间表**(联合唯一:同一用户+同一角色仅一行): +- **权限分配**:User ↔ Role 多对多(`UserRoleUUID` 作为全局唯一关联实体) +- **组织归属**:不再放 UserRole 上,改走关联表(多对多): + - `UserRoleDepartment`:(用户-角色对) ↔ 部门(`UserRoleUUID + DeptUUID`) + - `UserRoleWorkgroup`:(用户-角色对) ↔ 工作组(`UserRoleUUID + WorkgroupUUID`) +- **成员类型**:`RoleType`(0=成员 / 1=负责人/组长)冗余在关联表,**按部门/工作组区分** -**优势**:同一用户在不同公司/部门可绑不同角色,原生支持 SAAS 强需求 -**代价**:UserRole 违反单一职责,未来扩展需谨慎 +**优势**:一个用户-角色对可同时挂多个部门/工作组,且在不同部门可分别标注成员/负责人 +**注意**:UserRole 上的遗留字段(`DeptUUID / WorkgroupUUID / RoleType`)已废弃删除(见 gvsdsdk 0002 迁移), +全部语义以关联表为准。 #### (4) 角色作用域四档数据权限(`RoleScope`) | 类型 | 判定条件 | 可见范围 | |---|---|---| | `admin` | IsSuperuser/IsStaff 或 `admin:super` 权限 | 全公司 | -| `dept_manager` | `UserRole.RoleType=1` 且 `DeptUUID` 非空 | 本部门成员 | -| `workgroup_lead` | `UserRole.RoleType=1` 且 `WorkgroupUUID` 非空 | 本工作组成员 | +| `dept_manager` | `UserRoleDepartment.RoleType=1`(按当前公司过滤,可多部门) | 本部门成员 | +| `workgroup_lead` | `UserRoleWorkgroup.RoleType=1`(按当前公司过滤,可多工作组) | 本工作组成员 | | `member` | 其他 | 仅自己 | ### 4.4 运行时鉴权流程