Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 基于行的应用程序用户安全策略_Postgresql - Fatal编程技术网

Postgresql 基于行的应用程序用户安全策略

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

您好,我有一个问题,关于在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,
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[])