如何在Laravel应用中利用PostgreSQL行级安全管理多租户权限?
在Laravel中结合PostgreSQL行级安全的透明实现方案
我正尝试为Laravel后端应用启用PostgreSQL的行级安全,目标是把多租户权限管控完全迁移到数据库层面,彻底从应用逻辑中移除相关处理。这要求在所有数据库会话启动时执行SET app.tenant = 'current_tenant_id'语句,且要同时支持Eloquent ORM查询和原生DB查询。
已尝试的两种方案
通过监听器修改查询
该方案无效,因为DB::listen回调在查询执行后才触发,且未找到其他合适的Laravel回调或事件。
使用HTTP中间件
实现代码如下:
DB::statement("SET app.tenant = '<current_tenant_id>'");
此方案看似可行,但存在以下不足:
- 若切换至读写分离连接会失效,因为该代码会在其他数据库操作前选定连接,无法覆盖所有读写实例
- 覆盖场景不完整,无法处理后台任务等非HTTP请求场景。虽可在后台任务基类中实现,但仍存在与第一个问题相同的缺陷
此外,我尚未找到任何相关库、教程或文章,目前所见的Laravel多租户库均依赖多数据库连接切换或单数据库WHERE子句方案。
请问是否存在一种对开发团队基本透明的方式,在Laravel应用中利用PostgreSQL行级安全?
内容的提问来源于stack exchange,提问作者Patrick Johnmeyer
相关产品推荐
相关产品推荐

