Row Level Security PostgreSQL-en ezartzeari buruzko azterketa

Osagarri gisa PostgreSQL biltegiratutako funtzioen mailan negozio-logika ezartzeari buruzko azterketa ΠΈ batez ere erantzun zehatza lortzeko on duzu.

Atal teorikoa ondo deskribatuta dago dokumentazioan PostgreSQL - Errenkadak babesteko politikak. Jarraian, txiki baten ezarpen praktikoa dago negozio-zeregin zehatza - ezabatutako datuak ezkutatzea. Inplementazioari eskainitako krokisa Rol modelizazioa RLS erabiliz bereiz aurkeztuta.

Row Level Security PostgreSQL-en ezartzeari buruzko azterketa

Artikuluan ez dago ezer berririk, ez dago ezkutuko esanahirik edo ezkutuko ezagutzarik. Ideia teoriko baten ezarpen praktikoari buruzko zirriborro bat besterik ez. Norbaiti interesatzen bazaio, irakurri. Interesatzen ez bazaizu, ez galdu denbora.

Arazoaren formulazioa

Gai-eremuan sakondu gabe, laburki, arazoa honela formula daiteke: Enpresa-entitate jakin bat ezartzen duen mahai bat dago. Taularen errenkadak ezabatu egin daitezke, baina errenkadak ezin dira fisikoki ezabatu; ezkutatu egin behar dira.

Zeren esaten da: β€œEz ezabatu ezer, izena aldatu besterik ez. Internetek DENA gordetzen du"

Bide horretan, entitate honekin lan egiten duten gordetako funtzioak ez berridaztea komeni da.

Kontzeptu hau ezartzeko, taulak du atributua ezabatuta dago. Orduan dena erraza da: ziurtatu behar duzu bezeroak atributuak dituen lerroak soilik ikus ditzakeela. ezabatuta dago faltsua Zertarako erabiltzen da mekanismoa? Errenkada-mailako segurtasuna.

Inplementazioa

Sortu aparteko rol eta eskema

CREATE ROLE repos;
CREATE SCHEMA repos;

Sortu xede-taula

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

Barne hartzen ditugu Ilara Maila Segurtasuna

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 ;

Zerbitzu-funtzioa β€” taulako errenkada bat ezabatzea

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;

Enpresa-funtzioa β€” Dokumentu bat ezabatzea

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

Findings

Bezeroak dokumentua ezabatzen du

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

Ezabatu ondoren, bezeroak ez du dokumentua ikusten

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

Baina datu-basean dokumentua ez da ezabatzen, atributua bakarrik aldatzen da is_del

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

Arazoaren adierazpenean eskatzen zena.

Guztira

Gaia interesgarria bada, hurrengo azterketan Row Level Security erabiliz datuen sarbidea bereizteko roletan oinarritutako eredu bat ezartzeko adibide bat erakutsi dezakezu.

Iturria: www.habr.com

Gehitu iruzkin berria