Eng Etude iwwer d'Ëmsetzung vun Row Level Security am PostgreSQL

Als Ergänzung zu Eng Etude iwwer d'Ëmsetzung vun der Geschäftslogik um Niveau vun de PostgreSQL gespäichert Funktiounen и haaptsächlech fir eng detailléiert Äntwert op commentaire.

Den theoreteschen Deel ass gutt an der Dokumentatioun beschriwwen PostgreSQL - Rei Schutz Politiken. Drënner ass eng praktesch Ëmsetzung vun engem klenge spezifesch Affär Aufgab - verstoppt geläscht Donnéeën. Skizz gewidmet der Implementatioun Rollmodelléierung mat RLS getrennt presentéiert.

Eng Etude iwwer d'Ëmsetzung vun Row Level Security am PostgreSQL

Et gëtt näischt Neies am Artikel, et gëtt keng verstoppte Bedeitung oder geheimt Wëssen. Just eng Skizz iwwer d'praktesch Ëmsetzung vun enger theoretesch Iddi. Wann iergendeen interesséiert ass, liest et. Wann Dir net interesséiert sidd, verschwend net Är Zäit.

Problemerklärung

Ouni déif an d'Themaberäich ze tauchen, kuerz, kann de Problem wéi follegt formuléiert ginn: Et gëtt en Dësch deen eng bestëmmte Geschäftsunitéit implementéiert. Reihen an der Tabell kënne geläscht ginn, awer Reihen kënnen net kierperlech geläscht ginn; si musse verstoppt ginn.

Well et gëtt gesot: "Läscht näischt, einfach ëmbenennen. Den Internet späichert ALLES"

Ënnerwee ass et unzeroden net existent gespäichert Funktiounen ze iwwerschreiwe déi mat dëser Entitéit funktionnéieren.

Fir dëst Konzept ëmzesetzen, huet den Dësch den Attribut ass_geläscht. Dann ass alles einfach - Dir musst sécher sinn datt de Client nëmmen d'Linnen an deem d'Attribut gesinn ass_geläscht falsch Fir wat gëtt de Mechanismus benotzt? Rei Niveau Sécherheet.

Ëmsetzung

Schafen eng separat Roll a Schema

CREATE ROLE repos;
CREATE SCHEMA repos;

Schafen der Zil- Dësch

CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos

Umaachen Rei Niveau Sécherheet

ALTER TABLE repos.file  ENABLE ROW LEVEL SECURITY ;
CREATE POLICY file_invisible_deleted  ON repos.file FOR ALL TO dba_role USING ( NOT is_deleted );
GRANT ALL ON TABLE repos.file to dba_role ;
GRANT USAGE ON SCHEMA repos TO dba_role ;

Service Funktioun - eng Zeil an der Tabell läschen

CREATE OR REPLACE repos.delete( curr_id repos.file.id%TYPE)
RETURNS integer AS $$
BEGIN
...
UPDATE repos.file
SET is_del = TRUE 
WHERE id = curr_id ; 
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

Business Funktioun - en Dokument läschen

CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM  repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

Resultater

De Client läscht d'Dokument

SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );

Nom Läschen gesäit de Client d'Dokument net

SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)

Awer an der Datebank gëtt d'Dokument net geläscht, nëmmen den Attribut gëtt geännert ass_del

psql -d my_db
SELECT  id, name , is_del FROM repos.file ;
id |  name  | is_del
--+---------+------------
 1 |  test_1 | t
(1 row)

Wat ass wat an der Problemausso gefuerdert gouf.

D 'Resultat

Wann d'Thema interessant ass, kënnt Dir an der nächster Etude e Beispill weisen fir e Roll-baséiert Modell ëmzesetzen fir den Datezougang mat Row Level Security ze trennen.

Source: will.com

Setzt e Commentaire