PostgreSQL дээр эгнээний түвшний аюулгүй байдлыг хэрэгжүүлэх судалгаа

Нэмэлт болгон PostgreSQL хадгалагдсан функцүүдийн түвшинд бизнесийн логикийг хэрэгжүүлэх судалгаа и голчлон дэлгэрэнгүй хариулт авахын тулд тухай тайлбар.

Онолын хэсгийг баримт бичигт сайн тайлбарласан болно PostgreSQL - Мөр хамгаалах бодлого. Доорх нь жижиг практик хэрэгжилт юм тодорхой бизнесийн даалгавар - устгасан өгөгдлийг нуух. Хэрэгжүүлэхэд зориулагдсан ноорог RLS ашиглан үлгэр дуурайлал үзүүлэх тусад нь танилцуулсан.

PostgreSQL дээр эгнээний түвшний аюулгүй байдлыг хэрэгжүүлэх судалгаа

Нийтлэлд шинэ зүйл байхгүй, далд утга, нууц мэдлэг байхгүй. Зүгээр л онолын санааг практикт хэрэгжүүлэх тойм зураг. Сонирхсон хүн байвал уншаарай. Хэрэв та сонирхолгүй бол цагаа дэмий үрэх хэрэггүй.

Асуудлын тодорхойлолт

Сэдвийн талбарт гүнзгий шумбахгүйгээр асуудлыг товчхондоо дараах байдлаар томъёолж болно. Тодорхой аж ахуйн нэгжийг хэрэгжүүлдэг хүснэгт байдаг. Хүснэгтийн мөрүүдийг устгах боломжтой, гэхдээ мөрүүдийг физикээр устгах боломжгүй, тэдгээрийг нуусан байх ёстой.

Учир нь: "Юуг ч бүү устга, зүгээр л нэрийг нь өөрчил. Интернет нь бүх зүйлийг хадгалдаг"

Замдаа энэ байгууллагатай ажилладаг одоо байгаа хадгалагдсан функцүүдийг дахин бичихгүй байхыг зөвлөж байна.

Энэ үзэл баримтлалыг хэрэгжүүлэхийн тулд хүснэгт нь шинж чанартай байдаг устгагдсан. Дараа нь бүх зүйл энгийн байдаг - та үйлчлүүлэгч зөвхөн шинж чанар бүхий мөрүүдийг харж чадах эсэхийг шалгах хэрэгтэй устгагдсан худлаа Механизмыг юунд ашигладаг вэ? Мөрийн түвшний хамгаалалт.

Реализация

Тусдаа үүрэг, схемийг үүсгэ

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

сэтгэгдэл нэмэх