Täiendusena
Teoreetiline osa on dokumentatsioonis hästi kirjeldatud
Artiklis pole midagi uut, pole varjatud tähendust ega salateadmisi. Lihtsalt visand teoreetilise idee praktilisest elluviimisest. Kui kedagi huvitab, lugegu. Kui te pole huvitatud, ärge raisake oma aega.
Probleemi avaldus
Süvenemata teemavaldkonda, võib probleemi lühidalt sõnastada järgmiselt: Seal on tabel, mis rakendab teatud äriüksuse. Tabeli ridu saab kustutada, kuid ridu ei saa füüsiliselt kustutada, need peavad olema peidetud.
Sest öeldakse: "Ära kustuta midagi, lihtsalt nimeta see ümber. Internet salvestab KÕIK
Samal ajal ei ole soovitatav olemasolevaid salvestatud funktsioone, mis selle olemiga töötavad, ümber kirjutada.
Selle kontseptsiooni rakendamiseks on tabelis atribuut on_kustutatud. Siis on kõik lihtne - peate veenduma, et klient näeks ainult neid ridu, milles atribuut on on_kustutatud vale Milleks mehhanismi kasutatakse? Reataseme turvalisus.
Реализация
Looge eraldi roll ja skeem
CREATE ROLE repos;
CREATE SCHEMA repos;
Looge sihttabel
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Me kaasame Rea taseme turvalisus
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 ;
Teenindusfunktsioon — tabelist rea kustutamine
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;
Ärifunktsioon — dokumendi kustutamine
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Järeldused
Klient kustutab dokumendi
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Pärast kustutamist klient dokumenti ei näe
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Kuid andmebaasis dokumenti ei kustutata, vaid muudetakse ainult atribuuti is_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
See oli see, mida probleemi avalduses nõuti.
Summaarne
Kui teema on huvitav, saate järgmises uuringus näidata näidet rollipõhise mudeli rakendamisest andmetele juurdepääsu eraldamiseks, kasutades reataseme turvalisust.
Allikas: www.habr.com