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

删除表时的外键依赖项

外键为啥必须是唯一键?为啥至少唯一键才能作为其他表的外键?不唯一为啥不可以?

oracle中 主键和外键是啥意思?啥地方采用呢?

oracle中 主键和外键是啥意思?啥地方采用呢?

oracle中 主键和外键是啥意思?啥地方采用呢?