Studimi mbi implementimin e Sigurisë në Nivelin e Rreshtit në PostgreSQL

Si një shtesë për Studimi mbi realizimin e logjikës së biznesit në nivelin e funksioneve të pagabueshme PostgreSQL dhe në thelb për një përgjigje të zgjeruar në komentar.

Pjesa teorike Ă«shtĂ« e shkruar shumĂ« mirĂ« nĂ« dokumentacion Postgres Pro — Politikat e mbrojtjes sĂ« rreshtave. MĂ« poshtĂ« paraqitet realizimi praktik i njĂ« problemi specifik tĂ« biznesit — fshehja e tĂ« dhĂ«nave tĂ« fshirura. Studimi i dedikuar implementimit tĂ« modelit tĂ« rolit duke pĂ«rdorur RLS Ă«shtĂ« paraqitur veçmas.

Studimi mbi implementimin e Sigurisë në Nivelin e Rreshtit në PostgreSQL

NĂ« artikull nuk ka asgjĂ« tĂ« re, nuk ka kuptim tĂ« fshehur dhe njohuri sekrete. Thjesht njĂ« skicĂ« mbi realizimin praktik tĂ« njĂ« ideje teorike. NĂ«se dikujt i intereson — lexoni. NĂ«se nuk intereson — mos e humbni kohĂ«n tuaj kot.

Vendosja e detyrës

Pa u thelluar shumë në fushën e lëndës, shkurt, detyra mund të formulohet si më poshtë: ka një tabelë që realizon një entitet të caktuar biznesi. Rreshtat në tabelë mund të fshihen, por nuk mund të fshihen fizikisht, duhet të fshihen.

Sepse Ă«shtĂ« thĂ«nĂ« — "Mos fshi asgjĂ«, thjesht riemĂ«roje. Interneti ruan GJITHÇKA"

Përveç kësaj, është e dëshirueshme të mos rishkruhen funksionet e pagabueshme që tashmë funksionojnë me këtë entitet.

PĂ«r tĂ« realizuar kĂ«tĂ« koncept, tabela ka atributin is_deleted. MĂ« pas, çdo gjĂ« Ă«shtĂ« e thjeshtĂ« — Ă«shtĂ« e nevojshme tĂ« bĂ«het qĂ« klienti tĂ« mund tĂ« shohĂ« vetĂ«m rreshtat ku atributi is_deleted Ă«shtĂ« i falsifikuar. PĂ«r kĂ«tĂ« shĂ«rben mekanizmi Siguria nĂ« Nivel tĂ« Rreshtave.

Realizimi

Krijojmë një rol dhe një skemë të veçantë

Krijo ROL repos;
Krijo SKEMË repos;

Krijojmë tabelën e synuar

Krijo TABELË repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
Krijo SKEMË repos

Aktivizojmë Siguria në Nivel të Rreshtave

MODIFIKO TABELË repos.file ENABLE ROW LEVEL SECURITY;
Krijo POLITIKË file_invisible_deleted ON repos.file PËR TË GJITHA NGA dba_role PËRDORIMI (Nuk Ă«shtĂ« is_deleted);
PROFITO TË GJITHA NË TABELË repos.file pĂ«r dba_role;
PROFITO KËRKIMIN NË SKEMË repos pĂ«r dba_role;

Funksioni shĂ«rbyes — fshirja e njĂ« rreshti nĂ« tabelĂ«

Krijo OSE ZVENDOS repos.delete(curr_id repos.file.id%TYPE)
KTHE INTEGER AS $$
FILLIM
...
MODIFIKO repos.file
SET is_del = TRUE 
KU ID = curr_id;
...
FUND
$$ GJUHA plpgsql SIGURIA DEFINER;

Funksioni i biznesit — fshirja e dokumentit

Krijo OSE ZVENDOS business_functions.deleteDoc(doc_for_delete JSON)
KTHE JSON AS $$
FILLIM
...
PERFORM repos.delete(doc_id);
...
FUND
$$ GJUHA plpgsql SIGURIA DEFINER;

Rezultatet

Klienti fshin dokumentin

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

Pas fshirjes, klienti i dokumentit nuk e sheh

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

Por në DB dokumenti nuk është fshirë, vetëm është ndryshuar atributi is_del

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

ÇfarĂ« ishte e nevojshme pĂ«r tĂ« sqaruar objektivin.

Përfundimi

Nëse tema do të jetë interesante, në etyudin e ardhshëm mund të tregohet një shembull i zbatimit të modelit të rolit për ndarjen e aksesit në të dhëna duke përdorur Sigurinë në Nivelin e Rreshtave.

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster