Symfony 中的行级安全:跑迁移的那个角色绕过了你写的所有策略
来源:dev.to — 2026-08-21
📋 概述
作者从一条胜过原文的评论出发,深入探讨了 Symfony 单库多租户场景下的 PostgreSQL 行级安全(RLS)陷阱。他先认同评论观点:谓词不该放在 ORM 里,而应作为 Postgres 的 RLS 策略存在,这样 Messenger worker、原生 SQL 与临时 psql 会话都能拿到同一套 WHERE 约束。但真正的坑在于:不仅是超级用户会绕过 RLS,连"表的所有者"也会绕过该表的策略——而在几乎每个 Symfony 部署中,拥有表所有权的正是应用自己连接的数据库角色。这意味着你写的租户隔离策略可能从未真正生效。所有结论都在 PostgreSQL 18.3 上实测并附完整命令。
🔑 核心要点
- RLS 谓词应放 Postgres 而不是 ORM,这样 worker、原生 SQL 与临时会话都共享同一套 WHERE 约束。
- 不只是超级用户:仅"表的所有者"一个角色就会绕过该表的 RLS 策略,无需 BYPASSRLS。
- 几乎每个 Symfony 部署中,应用连接的数据库角色就是表的所有者——所以你写的租户隔离可能从未生效。
- 作者的另一条坑:测试连接是超级用户、而超级用户绕过 RLS,导致策略错误在测试里隐形。
💡 金句
那个拥有你所有表的角色,恰恰是你应用连接数据库时用的那个角色。
👍 0
👎 0
← 返回 dev.to 首页