行级安全(RLS)
PostgreSQL 中的行级安全(RLS)是什么?
行级安全让表可以通过 CREATE POLICY 创建的策略,逐行决定每个角色能够查看或修改哪些行。
行级安全(RLS)针对每个角色分别限制查询可以返回或修改哪些行。使用 ALTER TABLE ... ENABLE ROW LEVEL SECURITY 为表启用 RLS,然后用 CREATE POLICY 添加策略。策略的 USING 表达式过滤角色可见的行,WITH CHECK 表达式则决定允许哪些新增或更新后的行。
启用 RLS 后,如果没有任何适用的策略,PostgreSQL 会采用默认拒绝策略:任何行都不可见,也无法修改。超级用户和具有 BYPASSRLS 属性的角色总是绕过行安全,表的所有者通常也会绕过,除非该表设置了 FORCE ROW LEVEL SECURITY。请使用应用程序实际连接时所用的角色来测试策略。
示例
该示例为一张表启用 RLS,添加一条将 owner 列与 current_user 比较的策略,然后以角色 alice 查询该表。结果只返回 alice 的那一行。初始化步骤以超级用户身份运行,而超级用户会绕过 RLS,因此最后的查询会先切换角色。
CREATE TABLE notes (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
owner text NOT NULL,
body text NOT NULL
);
INSERT INTO notes (owner, body) VALUES ('alice', 'hello'), ('bob', 'hi');
ALTER TABLE notes ENABLE ROW LEVEL SECURITY;
CREATE POLICY notes_owner ON notes USING (owner = current_user);
CREATE ROLE alice;
GRANT SELECT ON notes TO alice;
SET ROLE alice;
SELECT * FROM notes;
RESET ROLE;适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。
参考资料
PostgreSQL 官方文档(英文)。