【问题标题】:PostgreSQL RLS is not applied as intendedPostgreSQL RLS 未按预期应用
【发布时间】: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。为什么?

https://www.db-fiddle.com/f/r1Mrh9QenB6YEuNCAkcqkQ/2

【问题讨论】:

  • 您的代码没有为创建的表启用 RLS。您还需要使用FORCE 选项,因为默认情况下,表的所有者会绕过 RLS。
  • @a_horse_with_no_name 但是我使用了set local role,所以选择的角色应该与表所有者不同吧?
  • 请不要只链接到代码,将代码添加到问题中。
  • @LaurenzAlbe 完成了

标签: postgresql row-level-security


【解决方案1】:

我只是忘了补充:

alter table doe enable row level security;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多