PostgreSQL-də Sıra Səviyyəsi Təhlükəsizliyinin tətbiqi ilə bağlı araşdırma

Əlavə olaraq PostgreSQL-də saxlanılan funksiyalar səviyyəsində biznes məntiqinin həyata keçirilməsinə dair araşdırma и əsasən ətraflı cavab üçün haqqında şərh.

Nəzəri hissə sənədlərdə yaxşı təsvir edilmişdir PostgreSQL - Sıra mühafizəsi siyasətləri. Aşağıda kiçik bir praktik həyata keçirilir xüsusi iş tapşırığı - silinmiş məlumatların gizlədilməsi. İcraya həsr olunmuş eskiz RLS istifadə edərək modelləşdirmə ayrıca təqdim olunur.

PostgreSQL-də Sıra Səviyyəsi Təhlükəsizliyinin tətbiqi ilə bağlı araşdırma

Məqalədə yeni heç nə yoxdur, gizli məna və ya gizli bilik yoxdur. Sadəcə nəzəri fikrin praktiki həyata keçirilməsi haqqında eskiz. Kim maraqlanırsa oxusun. Əgər maraqlanmırsınızsa, vaxtınızı boş yerə sərf etməyin.

Problem problemi

Mövzu sahəsinə dərindən girmədən, qısaca olaraq problemi aşağıdakı kimi formalaşdırmaq olar: Müəyyən bir sahibkarlıq subyektini həyata keçirən bir cədvəl var. Cədvəldəki sətirlər silinə bilər, lakin sətirlər fiziki olaraq silinə bilməz, onlar gizlədilməlidir.

Çünki deyilir: “Heç nəyi silməyin, sadəcə adını dəyişin. İnternet hər şeyi saxlayır"

Yol boyu, bu qurumla işləyən mövcud saxlanılan funksiyaları yenidən yazmamaq məsləhətdir.

Bu konsepsiyanı həyata keçirmək üçün cədvəl atributuna malikdir silindi. Sonra hər şey sadədir - müştərinin yalnız atributun olduğu sətirləri görə biləcəyinə əmin olmaq lazımdır silindi yalan Mexanizm nə üçün istifadə olunur? Sıra Səviyyə Təhlükəsizlik.

Tətbiq

Ayrı bir rol və sxem yaradın

CREATE ROLE repos;
CREATE SCHEMA repos;

Hədəf cədvəlini yaradın

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

Daxildir Sıra Səviyyə Təhlükəsizliyi

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 ;

Xidmət funksiyası — cədvəldəki sıranın silinməsi

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;

Biznes funksiyası - sənədin silinməsi

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

Tapıntılar

Müştəri sənədi silir

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

Silindikdən sonra müştəri sənədi görmür

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

Amma verilənlər bazasında sənəd silinmir, yalnız atribut dəyişdirilir is_del

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

Problem bəyanatında tələb olunan budur.

Ümumi

Mövzu maraqlıdırsa, növbəti araşdırmada siz Row Level Security-dən istifadə edərək verilənlərə girişi ayırmaq üçün rol əsaslı modelin həyata keçirilməsi nümunəsini göstərə bilərsiniz.

Mənbə: www.habr.com

Добавить комментарий