通过视图访问受行级安全保护的表时,该表的所有者将访问该表,从而使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.
答案 0 :(得分:0)
您可以选择:强制行级安全性或为表和视图使用其他所有者。