Kajian tentang pelaksanaan Row Level Security dalam PostgreSQL

Sebagai pelengkap kepada Kajian tentang melaksanakan logik perniagaan pada tahap fungsi tersimpan PostgreSQL ΠΈ terutamanya untuk jawapan terperinci pada ulasan.

Bahagian teori diterangkan dengan baik dalam dokumentasi PostgreSQL - Dasar perlindungan baris. Di bawah adalah pelaksanaan praktikal yang kecil tugas perniagaan khusus - menyembunyikan data yang dipadamkan. Lakaran khusus untuk pelaksanaan Model peranan menggunakan RLS dibentangkan secara berasingan.

Kajian tentang pelaksanaan Row Level Security dalam PostgreSQL

Tidak ada yang baru dalam artikel itu, tidak ada makna tersembunyi atau pengetahuan rahsia. Sekadar lakaran tentang pelaksanaan praktikal sesuatu idea teori. Jika ada yang berminat, bacalah. Jika anda tidak berminat, jangan buang masa anda.

Pernyataan masalah

Tanpa menyelam secara mendalam ke dalam kawasan subjek, secara ringkas, masalah boleh dirumuskan seperti berikut: Terdapat jadual yang melaksanakan entiti perniagaan tertentu. Baris dalam jadual boleh dipadamkan, tetapi baris tidak boleh dipadamkan secara fizikal; mereka mesti disembunyikan.

Kerana dikatakan: "Jangan padam apa-apa, hanya namakan ia. Internet menyimpan SEGALANYA"

Sepanjang perjalanan, adalah dinasihatkan untuk tidak menulis semula fungsi tersimpan sedia ada yang berfungsi dengan entiti ini.

Untuk melaksanakan konsep ini, jadual mempunyai atribut is_deleted. Kemudian segala-galanya adalah mudah - anda perlu memastikan bahawa pelanggan boleh melihat hanya baris di mana atribut is_deleted salah Apakah mekanisme yang digunakan? Keselamatan Tahap Baris.

РСализация

Buat peranan dan skema yang berasingan

CREATE ROLE repos;
CREATE SCHEMA repos;

Buat jadual sasaran

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

Kami merangkumi Keselamatan Tahap Baris

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 perkhidmatan β€” memadam baris dalam jadual

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 perniagaan β€” memadam dokumen

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

Penemuan

Pelanggan memadamkan dokumen

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

Selepas pemadaman, pelanggan tidak melihat dokumen itu

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

Tetapi dalam pangkalan data dokumen itu tidak dipadamkan, hanya atribut yang diubah is_del

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

Apakah yang diperlukan dalam pernyataan masalah.

Jumlah

Jika topik itu menarik, dalam kajian seterusnya anda boleh menunjukkan contoh pelaksanaan model berasaskan peranan untuk memisahkan akses data menggunakan Keselamatan Tahap Baris.

Sumber: www.habr.com

Tambah komen