PostgreSQL жүйесінде Row Level Security енгізу бойынша зерттеу

Қосымша ретінде PostgreSQL сақталған функциялар деңгейінде бизнес логикасын енгізу бойынша зерттеу и негізінен егжей-тегжейлі жауап алу үшін туралы Пікір.

Теориялық бөлім құжаттамада жақсы сипатталған PostgreSQL - Жолдарды қорғау саясаты. Төменде шағын практикалық іске асыру берілген нақты іскерлік тапсырма - жойылған деректерді жасыру. Іске асыруға арналған эскиз RLS көмегімен рөлдік модельдеу бөлек ұсынылған.

PostgreSQL жүйесінде Row Level Security енгізу бойынша зерттеу

Мақалада ешқандай жаңалық жоқ, жасырын мағына немесе құпия білім жоқ. Тек теориялық идеяны іс жүзінде жүзеге асыру туралы эскиз. Егер біреуді қызықтырса, оқыңыз. Егер сізді қызықтырмаса, уақытыңызды босқа өткізбеңіз.

Мәселенің тұжырымы

Пәндік салаға терең бойламай, қысқаша мәселені келесідей тұжырымдауға болады: Белгілі бір шаруашылық субъектісін жүзеге асыратын кесте бар. Кестедегі жолдарды жоюға болады, бірақ жолдарды физикалық түрде жою мүмкін емес, оларды жасыру керек.

Өйткені: «Ештеңені жоймаңыз, оның атын өзгертіңіз. Интернет барлығын сақтайды»

Жол бойында осы нысанмен жұмыс істейтін бар сақталған функцияларды қайта жазбаған жөн.

Бұл тұжырымдаманы жүзеге асыру үшін кестеде атрибут болады жойылды. Сонда бәрі қарапайым - клиент тек атрибут бар жолдарды көре алатынына көз жеткізу керек жойылды жалған Механизм не үшін қолданылады? Қатар деңгейінің қауіпсіздігі.

Реализация

Бөлек рөл мен схеманы жасаңыз

CREATE ROLE repos;
CREATE SCHEMA repos;

Мақсатты кестені жасаңыз

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

Қосыңыз Қатар деңгейіндегі қауіпсіздік

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 ;

Қызмет көрсету функциясы — кестедегі жолды жою

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;

Іскерлік функция — құжатты жою

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

нәтижелері

Клиент құжатты жояды

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

Жоюдан кейін клиент құжатты көрмейді

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

Бірақ деректер базасында құжат жойылмайды, тек атрибут өзгереді is_del

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

Бұл мәселе мәлімдемесінде талап етілетін нәрсе.

Нәтиже

Тақырып қызықты болса, келесі зерттеуде Row Level Security көмегімен деректерге қол жеткізуді бөлудің рөлдік үлгісін іске асыру мысалын көрсете аласыз.

Ақпарат көзі: www.habr.com

пікір қалдыру