PostgreSQL 行级安全性涉及与其他表的外键
Posted
技术标签:
【中文标题】PostgreSQL 行级安全性涉及与其他表的外键【英文标题】:PostgreSQL row-level security involving foreign key with other table 【发布时间】:2021-11-22 13:45:51 【问题描述】:我想知道在 PostgreSQL 中是否可以使用 RLS(或任何其他机制)进行以下操作。如果用户的 id 与另一个表中的列匹配,我希望用户能够获取表的某些行。
例如我们有以下表格:
“用户”表: 列:id、名称
| id | name |
| --- | --- |
| 1 | one |
| 2 | two |
| 3 | three|
| 4 | four |
“租户”表: 列:id、名称
| id | name |
| --- | --- |
| 1 | t1 |
| 2 | t2 |
“user_tenant”表: 列:user_id、tenant_id
| user_id | tenant_id|
| --- | --- |
| 1 | t1 |
| 2 | t2 |
| 3 | t1 |
| 4 | t2 |
现在我只想要拥有相同tenant_id 的用户。
输出:
| id | name |
| --- | --- |
| 1 | one |
| 3 | three|
要实现这一点,我需要创建类似这样的策略:
CREATE POLICY tenant_policy ON "user" USING (tenant_id = current_setting('my_user.current_tenant')::uuid);
但由于我正在吸引所有用户,因此无法使用上述政策。
注意:用户和租户表是多对多关系。
P.S. 我知道我们可以通过加入或其他一些条件来做到这一点。但我想使用 PostgreSQL 使用 RLS(行级安全)实现上述输出
提前致谢!!
【问题讨论】:
【参考方案1】:如果行级安全性不起作用,可能是因为以下情况之一适用:
您没有启用行级安全性:
ALTER TABLE "user" ENABLE ROW LEVEL SECURITY;
用户拥有该表
您可以为所有者启用行级安全性
ALTER TABLE "user" FORCE ROW LEVEL SECURITY;
您是超级用户,始终免于 RLS
您是使用BYPAs-s-rLS
定义的用户
参数row_security
设置为off
除此之外,您可能必须在您的政策中加入user_tenant
:
CREATE POLICY tenant_policy ON "user"
USING (
EXISTS(SELECT 1 FROM user_tenant AS ut
WHERE ut.user_id = "user".id
AND ut.tenant_id = current_setting('my_user.current_tenant')::uuid
)
);
【讨论】:
我不确定上述策略是否有效,因为表“user”中不存在tenant_id 列。我试过了,它给出了错误。 我明白了。我已添加建议的政策。 我已经尝试过你建议的那个,但是我也得到了所有租户的所有用户,除了一个用户租户:CREATE POLICY tenant_policy ON "user" USING ( EXISTS(SELECT 1 FROM user_tenant AS ut WHERE ut.user_id = id AND ut.tenant_id = current_setting('my_user.current_tenant')::uuid ) );
当我运行策略时,在 db 中它是以这种方式显示:(EXISTS ( SELECT 1 FROM user_tenant ut WHERE ((ut.user_id = ut.id) AND (ut.tenant_id = (current_setting('app_user.current_tenant'::text))::uuid))))
我的错误。我现在已经用表名限定了id
。
ohh.. 我不确定这是不是问题所在,因为现在当我按照您的建议创建策略时,它给出的结果为 0,而我尝试创建它的乳清却给出了错误 row violates row-level security policy for table "users"
任何关于那个?以上是关于PostgreSQL 行级安全性涉及与其他表的外键的主要内容,如果未能解决你的问题,请参考以下文章
sql [查找表的外键关联]找到一个表的外键postgresql #PostgreSQL