Panaliti ngeunaan ngalaksanakeun Row Level Security di PostgreSQL

Salaku pelengkap pikeun Hiji studi ngeunaan ngalaksanakeun logika bisnis di tingkat PostgreSQL fungsi disimpen и utamana pikeun jawaban lengkep dina komentar.

Bagian téoritis ogé dijelaskeun dina dokuméntasi PostgreSQL - Kawijakan panyalindungan baris. Di handap ieu palaksanaan praktis leutik tugas bisnis husus - nyumputkeun data dihapus. Sketsa dedicated ka palaksanaan Role modeling maké RLS dibere misah.

Panaliti ngeunaan ngalaksanakeun Row Level Security di PostgreSQL

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

Tambahkeun komentar