gpt4 book ai didi

Postgresql 简单行级安全性 (RLS)

转载 作者:行者123 更新时间:2023-12-03 08:27:27 27 4
gpt4 key购买 nike

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

我首先尝试创建一个“租户”表,该表的每一行只能由租户本身看到,然后将类似的规则应用于引用租户主键的其他表。

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

所以首先我创建我的表:

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

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

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 中插入 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 * FROM tenants

我明白了:

<表类=“s-表”><标题>tenant_id姓名 <正文>9c8e4f83-c036-4fcc-a775-228887d20851租户11953be83-683e-4960-a689-db8d53ba8cd2租户2064767f7-9541-4492-9a7d-0466ac94e2ec租户3

我在这里缺少什么?政策怎么可能没有被调用?

实际上,我什至不明白我在租户中的插入是否有效,而我还没有设置任何 session 变量。只是感觉 RLS 政策没有被考虑在内。

最佳答案

行级安全性有几个异常(exception):

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

  • 任何 super 用户除外

  • 任何使用 BYPASSRLS 的用户均被排除

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

从您的示例来看,您属于第一类。要为表所有者启用行级安全性,请运行

ALTER TABLE tenants FORCE ROW LEVEL SECURITY;

关于Postgresql 简单行级安全性 (RLS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66227828/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com