Astudiaeth ar weithredu Diogelwch Lefel Rhes yn PostgreSQL

Fel ategu at Astudiaeth ar weithredu rhesymeg busnes ar lefel swyddogaethau storio PostgreSQL и yn bennaf ar gyfer ateb manwl ar y sylw.

Disgrifir y rhan ddamcaniaethol yn dda yn y ddogfennaeth PostgreSQL - Polisïau amddiffyn rhesi. Isod mae gweithrediad ymarferol o fach tasg busnes penodol - cuddio data dileu. Braslun wedi'i neilltuo ar gyfer gweithredu Modelu rôl gan ddefnyddio RLS cyflwyno ar wahân.

Astudiaeth ar weithredu Diogelwch Lefel Rhes yn PostgreSQL

Nid oes dim byd newydd yn yr erthygl, nid oes unrhyw ystyr cudd na gwybodaeth gyfrinachol. Braslun yn unig am weithrediad ymarferol syniad damcaniaethol. Os oes gan unrhyw un ddiddordeb, darllenwch ef. Os nad oes gennych ddiddordeb, peidiwch â gwastraffu'ch amser.

Datganiad o'r broblem

Heb blymio'n ddwfn i'r maes pwnc, yn fyr, gellir llunio'r broblem fel a ganlyn: Mae tabl sy'n gweithredu endid busnes penodol. Gellir dileu rhesi yn y tabl, ond ni ellir dileu rhesi yn gorfforol; rhaid eu cuddio.

Oherwydd dywedir: “Peidiwch â dileu unrhyw beth, dim ond ei ailenwi. Mae'r Rhyngrwyd yn storio POPETH"

Ar hyd y ffordd, fe'ch cynghorir i beidio ag ailysgrifennu swyddogaethau storio presennol sy'n gweithio gyda'r endid hwn.

Er mwyn gweithredu'r cysyniad hwn, mae gan y tabl y priodoledd yn_dileu. Yna mae popeth yn syml - mae angen i chi sicrhau bod y cleient yn gallu gweld dim ond y llinellau y mae'r priodoledd yn_dileu ffug Ar gyfer beth mae'r mecanwaith a ddefnyddir? Diogelwch Lefel Rhes.

Gweithredu

Creu rôl a sgema ar wahân

CREATE ROLE repos;
CREATE SCHEMA repos;

Creu'r tabl targed

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

Rydym yn cynnwys Diogelwch Lefel Row

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 ;

Swyddogaeth gwasanaeth — dileu rhes yn y tabl

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;

Swyddogaeth busnes — dileu dogfen

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

Canfyddiadau

Mae'r cleient yn dileu'r ddogfen

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

Ar ôl dileu, nid yw'r cleient yn gweld y ddogfen

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

Ond yn y gronfa ddata nid yw'r ddogfen yn cael ei dileu, dim ond y priodoledd sy'n cael ei newid yn_del

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

Dyna oedd ei angen yn y datganiad problem.

Cyfanswm

Os yw'r pwnc yn ddiddorol, yn yr astudiaeth nesaf gallwch ddangos enghraifft o weithredu model rôl ar gyfer gwahanu mynediad data gan ddefnyddio Row Level Security.

Ffynhonnell: hab.com

Ychwanegu sylw