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 аркылуу берилиштерге жетүүнү бөлүү үчүн ролго негизделген моделди ишке ашыруунун мисалын көрсөтө аласыз.

Source: www.habr.com

Комментарий кошуу