【发布时间】:2020-03-03 14:03:53
【问题描述】:
我的数据库中有 2 个用户,一个是“强”,一个是“弱”。 我只想为其中一个弱用户应用 RLS 策略。 这意味着,当强用户查询表时,它应该获取所有行。但是当弱用户查询该表时,该策略将被应用,它只会返回允许的行。
我创建了一个表,并将 RLS 策略仅应用于弱用户。 但即使在使用强用户进行查询时,也会执行该策略并阻止我获取所有行。 我使用的是 PostgreSQL 版本 11.4。
这是我创建策略的方式(我已经与另一个第三个用户创建了策略,该用户是管理员和表的所有者)
CREATE TABLE account_test
(
id bigserial not null,
description varchar(200),
tenant_id UUID not null
);
ALTER TABLE account_test ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_policy ON account_test TO weak_user
USING (tenant_id = current_setting('rls.tenant_id')::uuid);
account=# select * from pg_policies;
schemaname | tablename | policyname | permissive | roles | cmd | qual | with_check
------------+--------------+---------------+------------+---------------+-----+--------------------------------------------------------------+------------
account | account_test | tenant_policy | PERMISSIVE | **{weak_user}** | ALL | (tenant_id = (current_setting('rls.tenant_id'::text))::uuid) |
现在,使用管理员用户插入和选择始终有效,因为它是所有者:
insert into account_test (description, tenant_id) VALUES ('desc111', '11111111-c929-462e-ade4-074c81643191');
select * from account_test;
这里没问题,所有行都返回了。
当尝试使用weak_user 登录并选择时,我没有得到预期的行:
select * from account_test;
-- returns 0 rows as expected (weak_user).
如果我设置了参数,则应用策略并且我按预期获取数据:
select set_config('rls.tenant_id', '11111111-c929-462e-ade4-074c81643191',true);
select * from account_test;
-- returns 1 row as expected
现在,当我使用strong_user 登录并执行select * from account_test 查询时,我希望返回所有行,因为策略仅适用于weak_user。
但是,我得到与weak_user 相同的行为,并且没有行返回。
使用 set_config 的查询也不返回任何内容。
我错过了什么?
这是预期的行为吗?
谁能解释一下?
【问题讨论】:
标签: postgresql policy rls