| LOAD 'test_rls_hooks'; |
| |
| CREATE TABLE rls_test_permissive ( |
| username name, |
| supervisor name, |
| data integer |
| ); |
| |
| -- initial test data |
| INSERT INTO rls_test_permissive VALUES ('regress_r1','regress_s1',4); |
| INSERT INTO rls_test_permissive VALUES ('regress_r2','regress_s2',5); |
| INSERT INTO rls_test_permissive VALUES ('regress_r3','regress_s3',6); |
| |
| CREATE TABLE rls_test_restrictive ( |
| username name, |
| supervisor name, |
| data integer |
| ); |
| |
| -- At least one permissive policy must exist, otherwise |
| -- the default deny policy will be applied. For |
| -- testing the only-restrictive-policies from the hook, |
| -- create a simple 'allow all' policy. |
| CREATE POLICY p1 ON rls_test_restrictive USING (true); |
| |
| -- initial test data |
| INSERT INTO rls_test_restrictive VALUES ('regress_r1','regress_s1',1); |
| INSERT INTO rls_test_restrictive VALUES ('regress_r2','regress_s2',2); |
| INSERT INTO rls_test_restrictive VALUES ('regress_r3','regress_s3',3); |
| |
| CREATE TABLE rls_test_both ( |
| username name, |
| supervisor name, |
| data integer |
| ); |
| |
| -- initial test data |
| INSERT INTO rls_test_both VALUES ('regress_r1','regress_s1',7); |
| INSERT INTO rls_test_both VALUES ('regress_r2','regress_s2',8); |
| INSERT INTO rls_test_both VALUES ('regress_r3','regress_s3',9); |
| |
| ALTER TABLE rls_test_permissive ENABLE ROW LEVEL SECURITY; |
| ALTER TABLE rls_test_restrictive ENABLE ROW LEVEL SECURITY; |
| ALTER TABLE rls_test_both ENABLE ROW LEVEL SECURITY; |
| |
| CREATE ROLE regress_r1; |
| CREATE ROLE regress_s1; |
| |
| GRANT SELECT,INSERT ON rls_test_permissive TO regress_r1; |
| GRANT SELECT,INSERT ON rls_test_restrictive TO regress_r1; |
| GRANT SELECT,INSERT ON rls_test_both TO regress_r1; |
| |
| GRANT SELECT,INSERT ON rls_test_permissive TO regress_s1; |
| GRANT SELECT,INSERT ON rls_test_restrictive TO regress_s1; |
| GRANT SELECT,INSERT ON rls_test_both TO regress_s1; |
| |
| SET ROLE regress_r1; |
| |
| -- With only the hook's policies, permissive |
| -- hook's policy is current_user = username |
| EXPLAIN (costs off) SELECT * FROM rls_test_permissive; |
| |
| SELECT * FROM rls_test_permissive; |
| |
| -- success |
| INSERT INTO rls_test_permissive VALUES ('regress_r1','regress_s1',10); |
| |
| -- failure |
| INSERT INTO rls_test_permissive VALUES ('regress_r4','regress_s4',10); |
| |
| SET ROLE regress_s1; |
| |
| -- With only the hook's policies, restrictive |
| -- hook's policy is current_user = supervisor |
| EXPLAIN (costs off) SELECT * FROM rls_test_restrictive; |
| |
| SELECT * FROM rls_test_restrictive; |
| |
| -- success |
| INSERT INTO rls_test_restrictive VALUES ('regress_r1','regress_s1',10); |
| |
| -- failure |
| INSERT INTO rls_test_restrictive VALUES ('regress_r4','regress_s4',10); |
| |
| SET ROLE regress_s1; |
| |
| -- With only the hook's policies, both |
| -- permissive hook's policy is current_user = username |
| -- restrictive hook's policy is current_user = superuser |
| -- combined with AND, results in nothing being allowed |
| EXPLAIN (costs off) SELECT * FROM rls_test_both; |
| |
| SELECT * FROM rls_test_both; |
| |
| -- failure |
| INSERT INTO rls_test_both VALUES ('regress_r1','regress_s1',10); |
| |
| -- failure |
| INSERT INTO rls_test_both VALUES ('regress_r4','regress_s1',10); |
| |
| -- failure |
| INSERT INTO rls_test_both VALUES ('regress_r4','regress_s4',10); |
| |
| RESET ROLE; |
| |
| -- Create "internal" policies, to check that the policies from |
| -- the hooks are combined correctly. |
| CREATE POLICY p1 ON rls_test_permissive USING (data % 2 = 0); |
| |
| -- Remove the original allow-all policy |
| DROP POLICY p1 ON rls_test_restrictive; |
| CREATE POLICY p1 ON rls_test_restrictive USING (data % 2 = 0); |
| |
| CREATE POLICY p1 ON rls_test_both USING (data % 2 = 0); |
| |
| SET ROLE regress_r1; |
| |
| -- With both internal and hook policies, permissive |
| EXPLAIN (costs off) SELECT * FROM rls_test_permissive; |
| |
| SELECT * FROM rls_test_permissive; |
| |
| -- success |
| INSERT INTO rls_test_permissive VALUES ('regress_r1','regress_s1',7); |
| |
| -- success |
| INSERT INTO rls_test_permissive VALUES ('regress_r3','regress_s3',10); |
| |
| -- failure |
| INSERT INTO rls_test_permissive VALUES ('regress_r4','regress_s4',7); |
| |
| SET ROLE regress_s1; |
| |
| -- With both internal and hook policies, restrictive |
| EXPLAIN (costs off) SELECT * FROM rls_test_restrictive; |
| |
| SELECT * FROM rls_test_restrictive; |
| |
| -- success |
| INSERT INTO rls_test_restrictive VALUES ('regress_r1','regress_s1',8); |
| |
| -- failure |
| INSERT INTO rls_test_restrictive VALUES ('regress_r3','regress_s3',10); |
| |
| -- failure |
| INSERT INTO rls_test_restrictive VALUES ('regress_r1','regress_s1',7); |
| |
| -- failure |
| INSERT INTO rls_test_restrictive VALUES ('regress_r4','regress_s4',7); |
| |
| -- With both internal and hook policies, both permissive |
| -- and restrictive hook policies |
| EXPLAIN (costs off) SELECT * FROM rls_test_both; |
| |
| SELECT * FROM rls_test_both; |
| |
| -- success |
| INSERT INTO rls_test_both VALUES ('regress_r1','regress_s1',8); |
| |
| -- failure |
| INSERT INTO rls_test_both VALUES ('regress_r3','regress_s3',10); |
| |
| -- failure |
| INSERT INTO rls_test_both VALUES ('regress_r1','regress_s1',7); |
| |
| -- failure |
| INSERT INTO rls_test_both VALUES ('regress_r4','regress_s4',7); |
| |
| RESET ROLE; |
| |
| DROP TABLE rls_test_restrictive; |
| DROP TABLE rls_test_permissive; |
| DROP TABLE rls_test_both; |
| |
| DROP ROLE regress_r1; |
| DROP ROLE regress_s1; |