Jako doplněk k
Teoretická část je dobře popsána v dokumentaci
V článku není nic nového, není tam žádný skrytý význam ani tajná znalost. Jen náčrt o praktické realizaci teoretické myšlenky. Pokud to někoho zajímá, přečtěte si to. Pokud nemáte zájem, neztrácejte čas.
Formulace problému
Aniž bychom se hluboce ponořili do předmětné oblasti, stručně lze problém formulovat takto: Existuje tabulka, která implementuje určitý podnikatelský subjekt. Řádky v tabulce lze smazat, ale řádky nelze smazat fyzicky, musí být skryté.
Neboť se říká: „Nic nemažte, jen to přejmenujte. Internet ukládá VŠECHNO"
Po cestě je vhodné nepřepisovat stávající uložené funkce, které s touto entitou pracují.
Pro implementaci tohoto konceptu má tabulka atribut is_deleted. Pak je vše jednoduché - musíte se ujistit, že klient vidí pouze řádky, ve kterých je atribut is_deleted Nepravdivé K čemu slouží mechanismus? Zabezpečení na úrovni řádku.
uskutečnění
Vytvořte samostatnou roli a schéma
CREATE ROLE repos;
CREATE SCHEMA repos;
Vytvořte cílovou tabulku
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Zapněte Zabezpečení na úrovni řádků
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 ;
Servisní funkce — smazání řádku v tabulce
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;
Obchodní funkce — smazání dokumentu
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
výsledky
Klient odstraní dokument
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Po smazání klient dokument nevidí
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Ale v databázi se dokument nesmaže, pouze se změní atribut is_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Což bylo požadováno v prohlášení o problému.
Celkový
Pokud je téma zajímavé, v další studii můžete ukázat příklad implementace modelu založeného na rolích pro oddělení přístupu k datům pomocí zabezpečení na úrovni řádků.
Zdroj: www.habr.com