Salaku pelengkap pikeun
Bagian téoritis ogé dijelaskeun dina dokuméntasi
Aya nanaon anyar dina artikel, euweuh harti disumputkeun atawa pangaweruh rusiah. Ngan sketsa ngeunaan palaksanaan praktis hiji gagasan teoritis. Manawi aya anu minat, mangga baca. Upami anjeun henteu resep, tong runtah waktos anjeun.
Ngarumuskeun masalah
Tanpa diving deeply kana wewengkon subjek, sakeudeung, masalah bisa dirumuskeun saperti kieu: Aya méja anu ngalaksanakeun éntitas bisnis anu tangtu. Baris dina tabel bisa dihapus, tapi baris teu bisa dihapus sacara fisik; aranjeunna kedah disumputkeun.
Sabab cenah: "Entong mupus nanaon, ngan ganti ngaran. Internét nyimpen sagala"
Sapanjang jalan, éta sasaena teu nulis balik fungsi disimpen aya nu dianggo kalayan éntitas ieu.
Pikeun nerapkeun konsép ieu, tabél boga atribut is_deleted. Lajeng sagalana geus basajan - anjeun kudu mastikeun yén klien nu bisa ningali ukur garis nu atribut is_deleted palsu Naon mékanisme dipaké pikeun? Kaamanan Tingkat Baris.
Реализация
Jieun peran jeung skéma misah
CREATE ROLE repos;
CREATE SCHEMA repos;
Jieun tabel target
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Kami kalebet Baris Level Kaamanan
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 ;
Fungsi palayanan - mupus hiji baris dina tabél
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;
Fungsi bisnis - mupus dokumén
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Hasil
Klién ngahapus dokumén
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Saatos ngahapus, klien teu ningali dokumén
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Tapi dina database dokumen teu dihapus, ngan atribut nu dirobah is_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Naon anu diperlukeun dina pernyataan masalah.
hasil
Если тема будет интересна, в следующем этюде можно показать пример реализации ролевой модели разделения доступа к данным с использованием Row Level Security.
sumber: www.habr.com