Sebuah studi tentang penerapan Row Level Security di PostgreSQL

Sebagai pelengkap Sebuah studi tentang penerapan logika bisnis pada tingkat fungsi tersimpan PostgreSQL ΠΈ terutama untuk jawaban terperinci pada komentar.

Bagian teoretis dijelaskan dengan baik dalam dokumentasi PostgreSQL - Kebijakan perlindungan baris. Di bawah ini adalah implementasi praktis kecilnya tugas bisnis tertentu - menyembunyikan data yang dihapus. Sketsa yang didedikasikan untuk implementasi Pemodelan peran menggunakan RLS disajikan secara terpisah.

Sebuah studi tentang penerapan Row Level Security di PostgreSQL

Tidak ada yang baru dalam artikel tersebut, tidak ada makna tersembunyi atau pengetahuan rahasia. Sekadar sketsa tentang implementasi praktis dari sebuah ide teoretis. Jika ada yang tertarik, bacalah. Jika Anda tidak tertarik, jangan buang waktu Anda.

Pernyataan masalah

Tanpa menyelami pokok bahasan secara mendalam, secara singkat permasalahan dapat dirumuskan sebagai berikut: Terdapat tabel yang mengimplementasikan suatu badan usaha tertentu. Baris dalam tabel dapat dihapus, namun baris tidak dapat dihapus secara fisik; baris tersebut harus disembunyikan.

Karena dikatakan: β€œJangan hapus apapun, ganti namanya saja. Internet menyimpan SEMUANYA"

Selama prosesnya, disarankan untuk tidak menulis ulang fungsi tersimpan yang berfungsi dengan entitas ini.

Untuk mengimplementasikan konsep ini, tabel memiliki atribut is_dihapus. Maka semuanya sederhana - Anda perlu memastikan bahwa klien hanya dapat melihat baris di mana atribut tersebut is_dihapus PALSU Untuk apa mekanisme tersebut digunakan? Keamanan Tingkat Baris.

Implementasi

Buat peran dan skema terpisah

CREATE ROLE repos;
CREATE SCHEMA repos;

Buat tabel target

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

Kami termasuk Keamanan Tingkat 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 layanan β€” menghapus satu baris dalam tabel

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 β€” menghapus 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;

Temuan

Klien menghapus dokumen

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

Setelah dihapus, klien tidak melihat dokumen tersebut

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

Namun di database dokumen tersebut tidak dihapus, hanya atributnya saja 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)

Itulah yang diperlukan dalam rumusan masalah.

Total

Jika topiknya menarik, pada penelitian selanjutnya dapat menunjukkan contoh penerapan model berbasis peran untuk memisahkan akses data menggunakan Row Level Security.

Sumber: www.habr.com

Tambah komentar