Postgresql 基于行的应用程序用户安全策略
您好,我有一个问题,关于在PostgreSQL 12中限制应用程序用户可能使用行级安全性访问的数据的方法 在我的场景中,我有一组报告表,其中每个表都有一个名为site_id的列。具有相同site_id的所有行彼此通用 例如:Postgresql 基于行的应用程序用户安全策略,postgresql,Postgresql,您好,我有一个问题,关于在PostgreSQL 12中限制应用程序用户可能使用行级安全性访问的数据的方法 在我的场景中,我有一组报告表,其中每个表都有一个名为site_id的列。具有相同site_id的所有行彼此通用 例如: CREATE TABLE public.devices ( page_views int8 NOT NULL, agent_id int4 NOT NULL, site_id int4 NOT NULL, date_visit date NOT NULL, CONSTRAI
CREATE TABLE public.devices (
page_views int8 NOT NULL,
agent_id int4 NOT NULL,
site_id int4 NOT NULL,
date_visit date NOT NULL,
CONSTRAINT devices_pkey PRIMARY KEY (site_id, date_visit, agent_id))
有一组单独的表与应用程序用户有关。应用程序用户与一组站点ID有关系
因此,用户“bob”与site_id(17、18、400、122)相关。因此,当“bob”登录到
web报表工具和执行查询bob应该只查看具有17、18、400和122作为其站点id的行。这是否可以使用PostgreSQL行级安全性实现,并且可以在不必在PostgreSQL中创建代表应用程序用户“bob”的第二个用户的情况下实现?我现在通过界面限制“bob”看到的内容,我只是想知道它是否可以使用行级安全性来实现。您所需要的只是SQL中的某种方法来确定当前用户是谁 所以您需要数据库中的一些状态 您可以使用占位符参数:
SET application.user = 'bob';
测试
current_setting('application.user')
或者您可以使用一个带有单个条目的临时表。Laurenz,感谢您为我设置了正确的路径。这就是我现在决定要做的:
create policy test_policy on devices
using (site_id in ((select unnest (string_to_array(current_setting('application.siteids'), ',')::int[]))));
set application.siteids = '244,681';
select * from devices;
您可以删除unnest并将条件简化为:
site\u id=any(字符串到数组(当前设置('application.siteids'),',')::int[])