【发布时间】:2021-04-12 17:38:46
【问题描述】:
我有一个函数current_user_selected_upr,它返回一个text。我想使用此功能来应用 rls 政策:
create or replace function current_user_selected_upr() returns text stable language sql as $$
select 'IDF' as upr;
$$;
create table if not exists doe(
id serial not null,
upr text not null default 'NE'
);
create user super_admin nologin;
grant select on doe to super_admin;
create policy doe_admin_policy
on public.doe
for select to "super_admin"
using (upr = private.current_user_selected_upr());
但是,该政策从未应用:
create or replace function test_rls() returns text language plpgsql security invoker as $$
declare
upr_doe text;
upr_config text;
begin
set local role super_admin;
select current_user_selected_upr() into upr_config;
select d.upr into upr_doe from doe d;
return concat('Config : ', upr_config, ' | rls results : ', upr_doe);
end;
$$;
select test_rls();
-- Returns Config : IDF | rls results : NE
我已经在小提琴中重现了这个问题。函数current_user_selected_upr 返回IDF,但选择的行是NE。为什么?
【问题讨论】:
-
您的代码没有为创建的表启用 RLS。您还需要使用
FORCE选项,因为默认情况下,表的所有者会绕过 RLS。 -
@a_horse_with_no_name 但是我使用了
set local role,所以选择的角色应该与表所有者不同吧? -
请不要只链接到代码,将代码添加到问题中。
-
@LaurenzAlbe 完成了
标签: postgresql row-level-security