蝉鸣 CRM 多租户与数据权限:一条客户记录如何被安全访问
菜单权限回答能做什么,数据权限还要回答能对谁的数据做。

CRM 保存客户联系人、合同金额和服务记录。一个用户能够打开客户页面,并不意味着他可以读取全部客户;一个 AI 工具拥有查询能力,也不意味着它可以绕过当前用户的数据范围。
权限不是前端按钮
隐藏菜单只能改善界面,真正的安全边界必须在网关、接口和领域查询中连续生效。
一次客户查询要经过六次判断
账号认证先确认请求者身份;租户上下文限定企业数据空间;接口权限判断是否允许执行查询;组织岗位说明用户在企业中的任职;客户归属标识负责人和协作关系;数据范围最终决定查询条件。任何一层失败都不应返回业务数据。
租户和组织不能混为一谈。租户隔离 SaaS 中不同企业,组织描述租户内部的公司、部门、校区或门店。同一人员可能跨组织任职并承担多个岗位,因此系统需要把真实用户、登录账号、组织成员和岗位关系分别建模。
菜单、接口与数据范围解决不同问题
菜单权限控制入口,接口权限控制动作,数据权限控制记录集合。例如顾问可以拥有“客户查询”接口,但只能查看本人负责或参与的客户;门店经理使用同一接口,可以查看本门店;总部管理者可能查看全部组织或汇总数据。三者若只实现其一,就会出现“看不到按钮但能调用接口”或“能进入页面却看到全公司数据”。
客户归属不仅是 owner_id。复杂销售中还包括协作团队、公海、组织归属和临时授权。线索从公海领取后建立负责人,商机可添加售前成员,合同审批人不因此自动获得客户全部编辑权。离职交接应批量转移责任并保留原历史。
数据权限应进入查询,而不是查询后过滤
先查出全部数据再在内存中过滤会增加泄露和性能风险。正确方式是在领域查询构造阶段加入租户、组织、归属和数据范围条件;详情、导出、统计与批量操作使用相同边界。缓存键、搜索索引和异步任务也必须携带租户语义,否则数据库隔离正确,缓存仍可能串租户。
写操作比读取更严格。转移客户、调整合同、确认回款等动作既要有接口权限,也要验证对象当前归属、业务状态与目标组织。工作流参与人可以处理审批任务,但流程权限不能自动扩大为所有字段访问权。
AI 与外部集成如何继承权限
MCP 工具通过 Feign 契约进入 CRM 领域服务,恢复账号、用户和租户上下文,再执行数据权限。Access Key 应绑定客户端和工具范围,不能成为绕开人员权限的后门。外部系统同步也应使用专用身份、最小接口集和可审计调用,而不是共享管理员账号。
权限上线前至少验证本人、本部门、跨部门、总部、离职交接、租户切换、导出、统计和 AI 工具九类场景。数据权限错误通常不会让页面崩溃,却可能悄悄返回不该出现的数据,因此必须有回归测试与审计。
