PostgreSQL-da Row Level Security dasturini amalga oshirish bo'yicha tadqiqot

ga qo'shimcha sifatida PostgreSQL saqlangan funktsiyalari darajasida biznes mantig'ini amalga oshirish bo'yicha tadqiqot и asosan batafsil javob uchun haqida sharh.

Nazariy qism hujjatlarda yaxshi tasvirlangan PostgreSQL - Qatorni himoya qilish siyosati. Quyida kichik bir amaliy amalga oshirish hisoblanadi muayyan biznes vazifasi - o'chirilgan ma'lumotlarni yashirish. Amalga oshirishga bag'ishlangan eskiz RLS yordamida modellashtirish alohida taqdim etilgan.

PostgreSQL-da Row Level Security dasturini amalga oshirish bo'yicha tadqiqot

Maqolada hech qanday yangilik yo'q, yashirin ma'no yoki maxfiy bilim yo'q. Nazariy fikrni amaliy amalga oshirish haqidagi eskiz. Agar kimdir qiziqsa, o'qing. Agar sizni qiziqtirmasa, vaqtingizni behuda sarflamang.

Muammoni shakllantirish

Mavzu sohasiga chuqur kirmasdan, qisqacha, muammoni quyidagicha shakllantirish mumkin: Muayyan xo'jalik yurituvchi sub'ektni amalga oshiradigan jadval mavjud. Jadvaldagi satrlarni o'chirish mumkin, lekin satrlarni jismoniy o'chirib bo'lmaydi, ular yashirilishi kerak.

Chunki shunday deyilgan: “Hech narsani o'chirmang, shunchaki nomini o'zgartiring. Internet hamma narsani saqlaydi"

Shu bilan birga, ushbu ob'ekt bilan ishlaydigan mavjud saqlangan funktsiyalarni qayta yozmaslik tavsiya etiladi.

Ushbu kontseptsiyani amalga oshirish uchun jadval atributiga ega o'chirildi. Keyin hamma narsa oddiy - mijoz faqat atribut mavjud bo'lgan satrlarni ko'rishiga ishonch hosil qilishingiz kerak o'chirildi yolg'on Mexanizm nima uchun ishlatiladi? Qator darajasidagi xavfsizlik.

Реализация

Alohida rol va sxema yarating

CREATE ROLE repos;
CREATE SCHEMA repos;

Maqsadli jadvalni yarating

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

Yoqing Qator darajadagi xavfsizlik

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 ;

Xizmat funktsiyasi — jadvaldagi qatorni oʻchirish

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 funktsiyasi - hujjatni o'chirish

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

Natijalar

Mijoz hujjatni o'chiradi

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

O'chirishdan keyin mijoz hujjatni ko'rmaydi

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

Ammo ma'lumotlar bazasida hujjat o'chirilmaydi, faqat atribut o'zgartiriladi is_del

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

Muammo bayonotida nima talab qilingan edi.

Xulosa

Agar mavzu qiziqarli bo'lsa, keyingi ishda siz Row Level Security yordamida ma'lumotlarga kirishni ajratish uchun rolga asoslangan modelni amalga oshirish misolini ko'rsatishingiz mumkin.

Manba: www.habr.com

a Izoh qo'shish