Studju dwar l-implimentazzjoni tas-Sigurtà fil-Livell tar-Ringiela f'PostgreSQL

Bħala komplement għal Studju dwar l-implimentazzjoni tal-loġika tan-negozju fil-livell tal-funzjonijiet maħżuna PostgreSQL и prinċipalment għal tweġiba dettaljata fuq kummentarju.

Il-parti teoretika hija deskritta sew fid-dokumentazzjoni PostgreSQL - Politika ta' protezzjoni tar-ringieli. Hawn taħt hija implimentazzjoni prattika ta 'żgħir kompitu speċifiku tan-negozju - ħabi tad-dejta mħassra. Skeċċ iddedikat għall-implimentazzjoni Immudellar tar-rwoli bl-użu ta' RLS ippreżentat separatament.

Studju dwar l-implimentazzjoni tas-Sigurtà fil-Livell tar-Ringiela f'PostgreSQL

M'hemm xejn ġdid fl-artiklu, m'hemm l-ebda tifsira moħbija jew għarfien sigriet. Biss skizz dwar l-implimentazzjoni prattika ta 'idea teoretika. Jekk xi ħadd hu interessat, aqrah. Jekk m'intix interessat, taħlix il-ħin tiegħek.

Dikjarazzjoni tal-problema

Mingħajr ma tgħaddas fil-fond fil-qasam tas-suġġett, fil-qosor, il-problema tista 'tiġi fformulata kif ġej: Hemm tabella li timplimenta ċerta entità kummerċjali. Ir-ringieli fit-tabella jistgħu jitħassru, iżda r-ringieli ma jistgħux jitħassru fiżikament; iridu jkunu moħbija.

Għax jingħad: “Tħassar xejn, semmieha biss. L-Internet jaħżen KOLLOX"

Tul it-triq, huwa rakkomandabbli li ma terġax tikteb funzjonijiet maħżuna eżistenti li jaħdmu ma 'din l-entità.

Biex timplimenta dan il-kunċett, it-tabella għandha l-attribut is_deleted. Imbagħad kollox huwa sempliċi - għandek bżonn tiżgura li l-klijent jista 'jara biss il-linji li fihom l-attribut is_deleted falza Għal xiex jintuża l-mekkaniżmu? Sigurtà fil-Livell tar-Ringiela.

Реализация

Oħloq rwol u skema separati

CREATE ROLE repos;
CREATE SCHEMA repos;

Oħloq it-tabella fil-mira

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

Ixgħel Sigurtà tal-Livell tar-Ringiela

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 ;

Funzjoni tas-servizz — it-tħassir ta' ringiela fit-tabella

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;

Funzjoni tan-negozju — it-tħassir ta' dokument

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

Sejbiet

Il-klijent iħassar id-dokument

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

Wara t-tħassir, il-klijent ma jarax id-dokument

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

Iżda fid-database id-dokument ma jitħassarx, l-attribut biss jinbidel is_del

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

Li huwa dak li kien meħtieġ fid-dikjarazzjoni tal-problema.

Total

Jekk is-suġġett huwa interessanti, fl-istudju li jmiss tista’ turi eżempju ta’ implimentazzjoni ta’ mudell ibbażat fuq ir-rwoli għas-separazzjoni tal-aċċess għad-dejta bl-użu ta’ Row Level Security.

Sors: www.habr.com

Żid kumment