Postgresql 简单行级安全性 (RLS)

Postgresql simple Row-Level Security (RLS)

我正在努力解决一个基本的行级安全问题。

我首先尝试创建一个“租户”table,在对引用租户主键的其他 table 应用类似规则之前,每一行只能由租户自己看到.

我在我的策略中使用会话变量,我还想从客户端强制执行租户 UUID(不是由服务器本身生成)。

所以一开始我创建 table:

CREATE TABLE tenants (
    tenant_id UUID,
    name text UNIQUE,
    PRIMARY KEY("tenant_id")
)

然后我启用 RLS 和强制使用给定会话变量的策略:

ALTER TABLE tenants ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenants_isolation_policy ON tenants
        USING (tenant_id = current_setting('my.tenant')::UUID)
        WITH CHECK (tenant_id = current_setting('my.tenant')::UUID)

然后我在 tenants table 中插入 3 个条目:

INSERT INTO "tenants" ("tenant_id", "name") VALUES ('9c8e4f83-c036-4fcc-a775-228887d20851', 'Tenant 1');
INSERT INTO "tenants" ("tenant_id", "name") VALUES ('1953be83-683e-4960-a689-db8d53ba8cd2', 'Tenant 2');
INSERT INTO "tenants" ("tenant_id", "name") VALUES ('064767f7-9541-4492-9a7d-0466ac94e2ec', 'Tenant 3')

然后我冒充租户1:

SET my.tenant = '9c8e4f83-c036-4fcc-a775-228887d20851'

现在我希望如果我 select 所有租户,结果我应该只有一排。

然而事实并非如此:

SELECT * FROM tenants

我得到:

tenant_id name
9c8e4f83-c036-4fcc-a775-228887d20851 Tenant 1
1953be83-683e-4960-a689-db8d53ba8cd2 Tenant 2
064767f7-9541-4492-9a7d-0466ac94e2ec Tenant 3

我在这里错过了什么? policy怎么可能没有被调用?

实际上,我什至不明白在我还没有设置任何会话变量的情况下,我在租户中的插入工作。感觉就是没有考虑到RLS政策。

行级安全有几个例外:

  • 默认情况下,table所有者除外

  • 任何超级用户除外

  • 任何 BYPASSRLS 的用户除外

  • 如果参数row_security关闭,行级安全性被禁用

从你的例子来看,你似乎属于第一类。要为 table 所有者也启用行级安全性,运行

ALTER TABLE tenants FORCE ROW LEVEL SECURITY;