Postgres:行级安全性不适用于视图

时间:2019-05-17 07:41:09

标签: postgresql

通过视图访问受行级安全保护的表时,该表的所有者将访问该表,从而使RLS无效。

我想要的是让用户的RLS与用户“ test_user”连接。这包括表和访问表的视图。该策略使用为交易设置的参数。 我已经看到,当test_user不是视图的所有者时,RLS不起作用。如果我将视图的所有者更改为test_user,它将起作用。 我想我知道,使用视图时,表是由视图的所有者访问的,而不是由用户访问视图的。

我希望用户test_admin成为所有表和视图的所有者。而且我想避免强制行级安全性,因为为了方便起见,我希望test_admin能够“绕过” RLS(运行脚本等时)。

我试图强制行级安全性,然后添加另一个宽松的策略,说允许test_admin访问该行,但这意味着test_user在访问视图时也会绕过RLS。

在Postgres中使用视图时是否绕过RLS是事实,因为用户将更改为视图的所有者?

--The setup. Connected as the role/user "test_admin".

    create table test_rls1
    (
    id INTEGER NOT NULL, 
    name TEXT NOT NULL,
    department_id INTEGER NOT NULL,
    PRIMARY KEY (id)
    );

    INSERT INTO test_rls1 VALUES (1, 'Peter', 1);
    INSERT INTO test_rls1 VALUES (2, 'Lisa', 2);

    CREATE POLICY test_rls1_policy ON test_rls1
     AS PERMISSIVE
     FOR SELECT
     TO PUBLIC
     USING (
             department_id = (COALESCE(nullif(current_setting('my.depid'::text, true),''),'-1'))::integer
     );

ALTER TABLE test_rls1 ENABLE ROW LEVEL SECURITY;  

CREATE VIEW test_rls1_view AS
SELECT id, name, department_id FROM test_rls1;

-- test_admin is the owner of the table and the view.
-- I have not executed "force row level security", so RLS will
-- not have effect on the test_admin user.

-- Connected as another role/user: "test_user":
-- select from the table

begin;
SELECT set_config('my.depid', '1', true);
select * from toed_rls1;
rollback;

-- This returns one row: Peter, department_id = 1

-- select from the view

    begin;
    SELECT set_config('my.depid', '1', true);
    select * from toed_rls1_view;
    rollback;

-- This returns all rows!! No RLS in effect.

1 个答案:

答案 0 :(得分:0)

您可以选择:强制行级安全性或为表和视图使用其他所有者。