Laravel如何实现同一服务多公司独立实例部署方案咨询
选型参考
两个原生方案都有明显硬伤,优先选中心认证节点+双模式多租户兼容的混合架构,完全覆盖你列的所有目标,长期维护成本远低于纯独立实例或纯单库加字段的方案。
先讲两个原生方案的固有缺陷
- 纯独立实例方案(方案1)
- 发版成本随客户量线性上涨,每次功能迭代要同步更新所有客户的Docker实例,一旦版本不一致很容易出现兼容性bug
- 原生Laravel Passport的token不跨实例互通,要做单点登录必须自行改造鉴权逻辑,重复开发量不小
- 纯单库加企业字段方案(方案2)
- 无法满足部分客户要求独立数据库的需求,且数据隔离完全依赖业务代码的查询条件,只要某一处逻辑漏加企业过滤条件,直接引发跨客户数据泄露,安全隐患很难完全排查
- 单库数据量上涨后,所有查询都要命中企业关联索引,性能调优成本高,也接不住大客户的独立部署需求
具体落地步骤
- 前端改造
保留单套Angular代码,移除硬编码的api_url逻辑,前端启动后固定访问中心认证节点,完成登录、租户选择后,根据认证节点返回的业务接口地址动态拼接后续请求前缀,不需要做多套前端部署。 - 中心认证节点搭建
单独部署一套轻量Laravel服务作为全局认证中心,核心只存三类数据:全局用户账号(邮箱、密码凭证)、用户-租户多对多关联关系、租户的服务路由信息(独立部署的客户存对应实例的域名/端口,共享集群的客户存租户ID、对应数据源配置)。
直接基于Laravel Passport颁发全局鉴权token,token内携带当前用户有权限访问的所有租户标识。用户完成账号密码校验后直接返回权限内的租户列表,用户选择目标租户后,认证中心直接返回对应业务端的访问地址,全程不需要跳转到业务端做二次登录,天然满足单点登录要求。 - 业务端双模式兼容
所有业务服务(不管是独立部署实例还是共享集群实例)统一加一层全局鉴权中间件,只做两件事:校验全局token的合法性、校验当前token是否持有目标租户的访问权限,校验通过才允许进入业务逻辑,不需要在每个业务模块重复写权限判断。- 对要求独立数据库的客户:直接部署独立Docker实例,配置标记为独立租户模式,直接连接客户专属数据库,中间件校验通过后不需要做额外数据过滤,性能和纯单租户部署完全一致,数据库层直接给当前实例分配专属数据库账号,从底层堵死跨库访问可能。
- 对使用共享集群的客户:不需要单独部署实例,在公共业务服务上开启共享租户模式,基于Laravel的动态连接能力,请求进来时根据token携带的租户ID自动切换对应数据库/schema,数据隔离在数据库连接层实现,不需要给每个业务表加企业字段,也不会出现业务查询漏加过滤条件的问题。
- 安全兜底
共享租户模式下所有数据查询统一走ORM封装,禁止直接执行原生SQL绕过租户自动过滤逻辑;文件存储按租户划分独立目录,避免跨租户文件越权访问。
常见坑点提示
- 不要在前端持久化存储租户路由、权限类敏感配置,所有信息每次从认证节点拉取,避免前端被篡改后越权访问其他租户资源
- 全局token不要设置过长有效期,配合刷新token机制使用,同时认证中心要支持token强制踢下线能力,用户权限变更后立刻失效对应凭证
- 独立实例部署不要用
latest镜像标签,每个发版版本打固定标签,按灰度节奏逐批更新客户实例,出问题可以快速回滚 - 租户的自定义配置(功能开关、字段规则等)统一存在认证中心,业务端启动/请求时拉取对应配置,不要在每个业务实例单独存配置,避免配置不一致
内容的提问来源于stack exchange,提问作者SaintGuacamole
相关产品推荐
相关产品推荐

