Combinación de varias políticas por usuario
RLS en Amazon Redshift permite asociar varias políticas por usuario y objeto. Si se han definido varias políticas para un usuario, Amazon Redshift aplica todas las políticas con la sintaxis AND u OR en función de la configuración de RLS CONJUNCTION TYPE para la tabla. Para obtener más información acerca del tipo de conjunción, consulte ALTER TABLE.
En una tabla, se pueden asociar varias políticas con el usuario. Puede suceder que varias políticas estén directamente asociadas al usuario o que este pertenezca a varios roles, y los roles tengan diferentes políticas asociadas a ellos.
Cuando varias políticas deben restringir el acceso a las filas en una relación determinada, puede establecer el RLS CONJUNCTION TYPE de la relación en AND. Considere el siguiente ejemplo. Alice solo puede ver los eventos deportivos que tengan el catname NBA, tal como se especifica en la política.
-- Create an analyst role and grant it to a user named Alice. CREATE ROLE analyst; CREATE USER alice WITH PASSWORD 'Name_is_alice_1'; GRANT ROLE analyst TO alice; -- Create an RLS policy that only lets the user see sports. CREATE RLS POLICY policy_sports WITH (catgroup VARCHAR(10)) USING (catgroup = 'Sports'); -- Create an RLS policy that only lets the user see NBA. CREATE RLS POLICY policy_nba WITH (catname VARCHAR(10)) USING (catname = 'NBA'); -- Attach both to the analyst role. ATTACH RLS POLICY policy_sports ON category TO ROLE analyst; ATTACH RLS POLICY policy_nba ON category TO ROLE analyst; -- Activate RLS on the category table with AND CONJUNCTION TYPE. ALTER TABLE category ROW LEVEL SECURITY ON CONJUNCTION TYPE AND; -- Change session to Alice. SET SESSION AUTHORIZATION alice; -- Select all from the category table. SELECT catgroup, catname FROM category; catgroup | catname ---------+--------- Sports | NBA (1 row)
Si las distintas políticas deben permitir a los usuarios ver más filas en una relación determinada, el usuario puede establecer el RLS CONJUNCTION TYPE de la relación en OR. Considere el siguiente ejemplo. Alice solo puede ver conciertos y deportes, según lo especificado en la política.
-- Create an analyst role and grant it to a user named Alice. CREATE ROLE analyst; CREATE USER alice WITH PASSWORD 'Name_is_alice_1'; GRANT ROLE analyst TO alice; -- Create an RLS policy that only lets the user see concerts. CREATE RLS POLICY policy_concerts WITH (catgroup VARCHAR(10)) USING (catgroup = 'Concerts'); -- Create an RLS policy that only lets the user see sports. CREATE RLS POLICY policy_sports WITH (catgroup VARCHAR(10)) USING (catgroup = 'Sports'); -- Attach both to the analyst role. ATTACH RLS POLICY policy_concerts ON category TO ROLE analyst; ATTACH RLS POLICY policy_sports ON category TO ROLE analyst; -- Activate RLS on the category table with OR CONJUNCTION TYPE. ALTER TABLE category ROW LEVEL SECURITY ON CONJUNCTION TYPE OR; -- Change session to Alice. SET SESSION AUTHORIZATION alice; -- Select all from the category table. SELECT catgroup, count(*) FROM category GROUP BY catgroup ORDER BY catgroup; catgroup | count ---------+------- Concerts | 3 Sports | 5 (2 rows)