功能与方案
多家公司共用一套系统,但不同角色只能看自己的数据,应该怎么设计?
推荐"一套系统 + 多租户隔离 + 角色权限"的组合,而不是为每家公司各做一套。系统层面通过组织 ID(公司/分公司/部门)做数据范围隔离,角色权限再控制到模块、按钮、字段级,绝大多数场景都能覆盖。除非客户特别敏感、要求物理库分开,否则统一部署在运维和迭代上更划算。
具体设计上分两条线:
数据隔离
每张业务表都带 org_id(或者 tenant_id),所有查询自动加上这个过滤条件。系统从用户登录的那一刻起就锁定他能看见的组织范围:
- 普通员工只能看自己所属公司的数据
- 区域经理可以看名下的几个分公司
- 集团管理员可以跨公司,但通常会做"只读"或"汇总"模式
为防止越权,建议在框架层(比如 MyBatis 拦截器、ORM 中间件)统一注入数据范围条件,而不是依赖每个开发自己在 SQL 里加 where,否则总会有漏的地方。
权限控制
角色权限要做到三层:
- 模块/菜单级:决定能不能看到这个功能入口
- 操作级:在能看到的模块里,决定能不能新增、修改、删除、导出
- 字段级(可选):敏感字段(比如客户手机号、毛利)只对特定角色显示
集团类客户的常见诉求是"我的人可以看你们公司的部分数据",比如审计、合规、风控。这种跨公司读权限要单独建表维护,不要靠角色硬塞,否则维护人员会很痛苦。
我们在 智慧园区管理系统 这类项目里就遇到过几十家子公司共用一套后台的情况,做法基本就是上面这一套。客户最关心的"我看不到别人家的数据、领导能看到全集"是能做到的,前提是组织结构和角色矩阵在前期就梳理清楚。