[HACKERS] Row Level Security Bug ? - Mailing list pgsql-hackers

From Andrea Adami
Subject [HACKERS] Row Level Security Bug ?
Date
Msg-id CAJgnxO93S4cW_jD7HcYPraKaobnLgkzFbVMhMM39zwUUcPQ7ZQ@mail.gmail.com
Whole thread Raw
Responses Re: [HACKERS] Row Level Security Bug ?  (Joe Conway <mail@joeconway.com>)
List pgsql-hackers
Hello,
i have a db with a couple of tables 
(enclosed the script to recreate it, please have a look before to proceed)
i enabled the row level security and all seem to work fine 

if i do it (connected in as superuser like, usualy, postgres is):

select school, description, example
from schools

i can see all the rows

if i do:


select school, description, example
from school

i see only one row (as expected)

but when i do:

select *
from _rls_test

select *
FROM _rls_test_security_barrier

select *
from _rls_test_with_check_local

select *
from _rls_test_with_check_local_cascade

I see all the rows always

this way i lack all the row level security i defined

is this either a bug or it's made by design ?
if it's made by design why ?
Is there  a way to write view that respect the row level security ?
For my point of view is a nonsense make a row level security that doesn't work with the view.

Thanks to all the spend time to answer me.

here:
you can have a look at the complete database 

Andrea Adami

===============================================
===============================================
===============================================

CREATE DATABASE test
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       CONNECTION LIMIT = -1;


CREATE SEQUENCE public.pk_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 736220
  CACHE 1;


CREATE TABLE public.schools
(
  school bigint NOT NULL DEFAULT nextval('pk_seq'::regclass), -- Uniquely identifies the table row
  description character varying(160) NOT NULL, -- Description for the school
  processing_code character varying(160) NOT NULL, -- A code that identify the school on the government information system
  mnemonic character varying(30) NOT NULL, -- Short description to be use as code
  example boolean NOT NULL DEFAULT false, -- It indicates that the data have been inserted to be an example of the use of the data base
  behavior bigint, -- Indicates the subject used for the behavior
  CONSTRAINT schools_pk PRIMARY KEY (school),
  CONSTRAINT schools_uq_description UNIQUE (description),
  CONSTRAINT schools_uq_mnemonic UNIQUE (mnemonic),
  CONSTRAINT schools_uq_processing_code UNIQUE (processing_code, example)
);

-- Index: public.schools_fk_behavior

CREATE INDEX schools_fk_behavior
  ON public.schools
  USING btree
  (behavior);


CREATE TABLE public.usenames_schools
(
  usename_school bigint NOT NULL DEFAULT nextval('pk_seq'::regclass), -- Unique identification code for the row
  usename name NOT NULL, -- The session's usename
  school bigint NOT NULL, -- School enabled for the the usename
  CONSTRAINT usenames_schools_pk PRIMARY KEY (usename_school),
  CONSTRAINT usenames_schools_fk_school FOREIGN KEY (school)
      REFERENCES public.schools (school) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT usenames_schools_uq_usename_school UNIQUE (usename, school) -- Foe every usename one school can be enabled only one time
);

-- Index: public.usenames_schools_fx_school

CREATE INDEX usenames_schools_fx_school
  ON public.usenames_schools
  USING btree
  (school);

  CREATE OR REPLACE VIEW public._rls_test AS 
 SELECT schools.school,
    schools.description,
    schools.example
   FROM schools;
   
   
CREATE OR REPLACE VIEW public._rls_test_security_barrier WITH (security_barrier=true) AS 
 SELECT schools.school,
    schools.description,
    schools.example
   FROM schools;

CREATE OR REPLACE VIEW public._rls_test_with_check_local WITH (check_option=local) AS 
 SELECT schools.school,
    schools.description,
    schools.example
   FROM schools;

CREATE OR REPLACE VIEW public._rls_test_with_check_local_cascade WITH (check_option=cascaded) AS 
 SELECT schools.school,
    schools.description,
    schools.example
   FROM schools;  
  
-- now same data 
-- now same data 
-- now same data 

INSERT INTO public.schools(school,description,processing_code,mnemonic,example) VALUES ('28961000000000','Istituto comprensivo "Voyager"','ZZIC00001Z','IC VOYAGER','t');
INSERT INTO public.schools(school,description,processing_code,mnemonic,example) VALUES ('2000000000','Istituto Tecnico Tecnologico "Leonardo da Vinci"','ZZITT0000Z','ITT DAVINCI','t');
INSERT INTO public.schools(school,description,processing_code,mnemonic,example) VALUES ('1000000000','Istituto comprensivo ''Andromeda''','ZZIC80000Z','IC ANDROMEDA','t'); 


INSERT INTO public.usenames_schools(usename_school,usename,school) VALUES ('726633000000000','manager-a@scuola-1.it','1000000000');


-- THEN ENABLE ROW LEVEL SECURITY
-- THEN ENABLE ROW LEVEL SECURITY
-- THEN ENABLE ROW LEVEL SECURITY
  

  ALTER TABLE usenames_schools ENABLE ROW LEVEL SECURITY;
 
 ALTER TABLE schools ENABLE ROW LEVEL SECURITY;
  
CREATE POLICY usenames_schools_pl_usename ON usenames_schools TO public 
 USING (usename = current_user)
  WITH CHECK (usename = current_user);

CREATE POLICY schools_pl_school ON schools TO public 
 USING (school IN (SELECT school FROM usenames_schools))
  WITH CHECK (school IN (SELECT school FROM usenames_schools));
 
 
 
 
 
 

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: [HACKERS] PSA: don't be in a hurry to update to XCode 9.0
Next
From: Andrey Borodin
Date:
Subject: Re: [HACKERS] New gist vacuum.