【发布时间】:2019-11-25 09:14:54
【问题描述】:
我正在尝试在 Postgres 中实现行级安全性。实际上,我有很多角色,但是为了这个问题,有四个角色:executive、director、manager和junior。我有一个看起来像这样的表:
SELECT * FROM ex_schema.residence; --as superuser
primary_key | residence | security_level
------------------+---------------+--------------
5 | Time-Share | executive
1 | Single-Family | junior
2 | Multi-Family | director
4 | Condominium | manager
6 | Modular | junior
3 | Townhouse | director
我编写了一个启用行级安全性的策略,如下所示:
CREATE POLICY residence_policy
ON ex_schema.residence
FOR ALL
USING (security_level = CURRENT_USER)
WITH CHECK (primary_key IS NOT NULL AND security_level = CURRENT_USER);
正如预期的那样,当executive 连接到数据库并选择表时,该角色只能看到security_level 列中具有executive 的行。我想做的是启用行级安全性,以便更高安全性角色可以看到与其安全级别匹配的行以及具有较低安全权限的行。层次结构如下所示:
ROW ACCESS PER ROLE
executive: executive, director, manager, junior
director: director, manager, junior
manager: manager, junior
junior: junior
我想知道如何实现这种类型的行级策略,以便特定角色可以访问多种类型的安全级别。可以灵活地更改 security_level 列结构和数据类型。
【问题讨论】:
标签: postgresql postgresql-11 row-level-security