PostgreSQL ۾ قطار ليول سيڪيورٽي کي لاڳو ڪرڻ تي هڪ مطالعو

جي مڪمل طور تي PostgreSQL ذخيرو ٿيل افعال جي سطح تي ڪاروباري منطق کي لاڳو ڪرڻ تي ھڪڙو مطالعو и خاص طور تي تفصيلي جواب لاء تي комментарий.

نظرياتي حصو چڱي طرح دستاويز ۾ بيان ڪيو ويو آهي PostgreSQL - قطار جي حفاظت جي پاليسي. هيٺ هڪ ننڍڙي جو عملي عمل آهي مخصوص ڪاروباري ڪم - ختم ٿيل ڊيٽا کي لڪائڻ. خاڪو لاڳو ڪرڻ لاء وقف RLS استعمال ڪندي رول ماڊلنگ الڳ الڳ پيش ڪيو.

PostgreSQL ۾ قطار ليول سيڪيورٽي کي لاڳو ڪرڻ تي هڪ مطالعو

مضمون ۾ ڪا به نئين ڳالهه نه آهي، ڪا ڳجهي معنيٰ يا ڳجهي ڄاڻ نه آهي. صرف نظرياتي خيال جي عملي عمل جي باري ۾ هڪ خاڪو. جيڪڏهن ڪنهن کي دلچسپي آهي، پڙهي. جيڪڏهن توهان دلچسپي نه آهيو، پنهنجو وقت ضايع نه ڪريو.

مسئلو جي ترتيب

موضوع واري علائقي ۾ گهمڻ کان سواء، مختصر طور تي، مسئلو هن ريت ترتيب ڏئي سگهجي ٿو: اتي ھڪڙو ٽيبل آھي جيڪو ھڪڙي خاص ڪاروباري ادارو کي لاڳو ڪري ٿو. ٽيبل ۾ قطارون ڊهي سگھجن ٿيون، پر قطارون جسماني طور ڊهي نه ٿيون سگھجن؛ انھن کي لڪائڻ گھرجي.

ان لاءِ چيو ويو آهي ته: ”ڪنهن به شيءِ کي نه هٽايو، بس ان جو نالو مٽايو. انٽرنيٽ هر شي کي محفوظ ڪري ٿو"

رستي ۾، اهو مشورو ڏنو ويو آهي ته موجوده محفوظ ڪيل ڪمن کي ٻيهر نه لکجي جيڪي هن اداري سان ڪم ڪن ٿا.

ھن تصور کي لاڳو ڪرڻ لاء، جدول آھي وصف is_deleted. پوءِ سڀ ڪجهه سادو آهي - توهان کي پڪ ڪرڻ جي ضرورت آهي ته ڪلائنٽ صرف اهي سٽون ڏسي سگهي ٿو جنهن ۾ وصف is_deleted ڪوڙو ڪهڙي ميکانيزم لاء استعمال ڪيو ويو آهي؟ قطار جي سطح سيڪيورٽي.

عمل

هڪ الڳ ڪردار ۽ اسڪيما ٺاهيو

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)

جيڪو مسئلو بيان ۾ گهربل هو.

نتيجو

جيڪڏهن موضوع دلچسپ آهي، ته ايندڙ مطالعي ۾ توهان رول ليول سيڪيورٽي استعمال ڪندي ڊيٽا جي رسائي کي الڳ ڪرڻ لاءِ ڪردار جي بنياد تي ماڊل لاڳو ڪرڻ جو مثال ڏيکاري سگهو ٿا.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو