sql - 涉及外键与其他表的 PostgreSQL 行级安全性

标签 sql postgresql

我想知道在使用 RLS(或任何其他机制)的 PostgreSQL 中是否可以实现以下功能。如果表的 ID 与另一个表中的列匹配,我希望用户能够获取该表的某些行。

例如我们有下表:

“用户”表: 列:id,名称

| id | name  |
| --- | ---  |
| 1   | one  |
| 2   | two  |
| 3   | three|
| 4   | four |

“租户”表: 列:id,名称

| id | name |
| --- | --- |
| 1   | t1  |
| 2   | t2  |

“用户租户”表: 列: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. 我知道我们可以通过加入或其他一些条件来做到这一点。但我想使用 RLS(行级安全性)使用 PostgreSQL 实现上述输出

提前致谢!

最佳答案

如果行级安全性不起作用,可能是因为以下情况之一:

  • 您没有启用行级安全性:

    ALTER TABLE "user" ENABLE ROW LEVEL SECURITY;
    
  • 用户拥有该表

    您可以为所有者启用行级安全性

    ALTER TABLE "user" FORCE ROW LEVEL SECURITY;
    
  • 您是 super 用户,始终不受 RLS 限制

  • 您是使用 BYPASSRLS 定义的用户

  • 参数 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
            )
      );

关于sql - 涉及外键与其他表的 PostgreSQL 行级安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69381358/

相关文章:

ruby-on-rails - 如何从两个不同的外键访问模型?

postgresql - 如何将 Hstore 键和值分解为 postgres 中的单独列

postgresql - 是否可以将 LinqPad 与 PostgreSQL 一起使用?

sql - SQL JOIN 中的 AND/OR 语句

sql - 同步两个xml文档的tsql代码

php - 使用 BASH 存储和循环 MySQL 获取的结果?

c# - 使用 EntityFramework 6 (C#) 连接到 PostgreSQL 数据库

mysql - 在 GROUP BY 级别上使用 "CASE"命令

mysql - 如何将sql日期格式unix时间戳转换为dd mm yy格式的日期格式?

django - 将 PositiveIntegerField 迁移到 FloatField