mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-23 06:47:14 +08:00
Add support for security invoker views.
A security invoker view checks permissions for accessing its underlying base relations using the privileges of the user of the view, rather than the privileges of the view owner. Additionally, if any of the base relations are tables with RLS enabled, the policies of the user of the view are applied, rather than those of the view owner. This allows views to be defined without giving away additional privileges on the underlying base relations, and matches a similar feature available in other database systems. It also allows views to operate more naturally with RLS, without affecting the assignments of policies to users. Christoph Heiss, with some additional hacking by me. Reviewed by Laurenz Albe and Wolfgang Walther. Discussion: https://postgr.es/m/b66dd6d6-ad3e-c6f2-8b90-47be773da240%40cybertec.at
This commit is contained in:
@ -254,9 +254,19 @@ CREATE VIEW mysecview5 WITH (security_barrier=100) -- Error
|
||||
AS SELECT * FROM tbl1 WHERE a > 100;
|
||||
CREATE VIEW mysecview6 WITH (invalid_option) -- Error
|
||||
AS SELECT * FROM tbl1 WHERE a < 100;
|
||||
CREATE VIEW mysecview7 WITH (security_invoker=true)
|
||||
AS SELECT * FROM tbl1 WHERE a = 100;
|
||||
CREATE VIEW mysecview8 WITH (security_invoker=false, security_barrier=true)
|
||||
AS SELECT * FROM tbl1 WHERE a > 100;
|
||||
CREATE VIEW mysecview9 WITH (security_invoker)
|
||||
AS SELECT * FROM tbl1 WHERE a < 100;
|
||||
CREATE VIEW mysecview10 WITH (security_invoker=100) -- Error
|
||||
AS SELECT * FROM tbl1 WHERE a <> 100;
|
||||
SELECT relname, relkind, reloptions FROM pg_class
|
||||
WHERE oid in ('mysecview1'::regclass, 'mysecview2'::regclass,
|
||||
'mysecview3'::regclass, 'mysecview4'::regclass)
|
||||
'mysecview3'::regclass, 'mysecview4'::regclass,
|
||||
'mysecview7'::regclass, 'mysecview8'::regclass,
|
||||
'mysecview9'::regclass)
|
||||
ORDER BY relname;
|
||||
|
||||
CREATE OR REPLACE VIEW mysecview1
|
||||
@ -267,9 +277,17 @@ CREATE OR REPLACE VIEW mysecview3 WITH (security_barrier=true)
|
||||
AS SELECT * FROM tbl1 WHERE a < 256;
|
||||
CREATE OR REPLACE VIEW mysecview4 WITH (security_barrier=false)
|
||||
AS SELECT * FROM tbl1 WHERE a <> 256;
|
||||
CREATE OR REPLACE VIEW mysecview7
|
||||
AS SELECT * FROM tbl1 WHERE a > 256;
|
||||
CREATE OR REPLACE VIEW mysecview8 WITH (security_invoker=true)
|
||||
AS SELECT * FROM tbl1 WHERE a < 256;
|
||||
CREATE OR REPLACE VIEW mysecview9 WITH (security_invoker=false, security_barrier=true)
|
||||
AS SELECT * FROM tbl1 WHERE a <> 256;
|
||||
SELECT relname, relkind, reloptions FROM pg_class
|
||||
WHERE oid in ('mysecview1'::regclass, 'mysecview2'::regclass,
|
||||
'mysecview3'::regclass, 'mysecview4'::regclass)
|
||||
'mysecview3'::regclass, 'mysecview4'::regclass,
|
||||
'mysecview7'::regclass, 'mysecview8'::regclass,
|
||||
'mysecview9'::regclass)
|
||||
ORDER BY relname;
|
||||
|
||||
-- Check that unknown literals are converted to "text" in CREATE VIEW,
|
||||
|
||||
Reference in New Issue
Block a user