【问题标题】:Row level select policy on Postgres (greenplum)Postgres 上的行级选择策略(greenplum)
【发布时间】:2016-03-14 22:28:56
【问题描述】:

我使用的是 Greenploum 数据库,但我假设它或多或少与 Postgres 相同。我想根据表分区的列的值来实现行级安全策略。

我有一张桌子。 TABLE rank(id int、rank int、year int、gender char(1)、count int、source_system text)

示例数据: (1,2, 2012, 1,1, source_system_a), (2,1, 2012, 1,1, source_system_b), (3,4, 2012, 1,1, source_system_a), (4,3, 2012, 1,1, source_system_c),

根据 source_system 列对表进行分区。我希望有一组可以看到所有数据的用户和一组不能看到基于 source_system 列的所有内容的用户。 source_system_a 应该是一个安全值,因此只有具有安全权限的人才能看到 source_system_a 所在的行。

例如,

用户 a(可以查看全部)确实“从排名中选择 *;”

结果: 1,2, 2012, 1,1, source_system_a, 2,1, 2012, 1,1, source_system_b, 3,4, 2012, 1,1, source_system_a, 4,3, 2012, 1,1, source_system_c,

用户 b(不安全)确实 'select * from rank;'

结果: 2,1, 2012, 1,1, source_system_b, 4,3, 2012, 1,1, source_system_c,

非常感谢

【问题讨论】:

  • “我使用的是 Greenploum 数据库,但我假设它或多或少与 Postgres 相同”。它不是。它基于经过大幅修改的非常旧的 PostgreSQL 版本。

标签: sql postgresql permissions greenplum row-level-security


【解决方案1】:

除了为不同的用户组创建视图之外,Greenplum 没有行级安全性 (RLS)。如果您使用视图来动态隐藏行,则有一种方法可以查看隐藏的行,因此请不要这样做。

在引入 security_barrier 特性之前,PostgreSQL 在视图方面也存在同样的问题,但 Greenplum 还没有。

因此,对于您的示例,我将创建两个视图:

CREATE TABLE rank (id int, rank int, year int, gender char(1), count int, source_system text) DISTRIBUTED BY (id);
CREATE USER user_a;
CREATE USER user_b;

CREATE VIEW vw_rank_a AS SELECT * FROM rank;
CREATE VIEW vw_rank_b AS SELECT * FROM rank WHERE source_system <> 'source_system_a';

GRANT SELECT ON vw_rank_a TO user_a;
GRANT SELECT ON vw_rank_b TO user_b;

【讨论】:

  • 是的,在采用某种 RLS 之前,这看起来是最好的方法。不想走视图方法。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多