Artikull mbi zbatimin e Row Level Security në PostgreSQL

Si një shtesë për Artikull mbi zbatimin e logjikës së biznesit në nivelin e funksioneve të ruajtura PostgreSQL dhe pjesën kryesore të përgjigjes së zgjeruar në koment.

Pjesa teorike Ă«shtĂ« pĂ«rshkruar shkĂ«lqyeshĂ«m nĂ« dokumentacion Postgres Pro — Politikat e mbrojtjes sĂ« rreshtave. MĂ« poshtĂ« Ă«shtĂ« shqyrtuar njĂ« zbatim praktik tĂ« njĂ« problemi tĂ« caktuar biznesi — fshehja e tĂ« dhĂ«nave tĂ« fshira. Studimi i kushtohet realizimit modelit tĂ« rolit duke pĂ«rdorur RLS Ă«shtĂ« paraqitur veçmas.

Artikull mbi zbatimin e Row Level Security në PostgreSQL

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

Formulimi i detyrës

Pa u thelluar shumë në fushën temore, shkurt, detyra mund të formulohet kështu: kemi një tabelë që realizon një entitet biznesi. Rreshtat në tabelë mund të fshihen, por nuk lejohet të fshihen fizikisht rreshtat, duhet t'i fshehim ata.

Sepse Ă«shtĂ« thĂ«nĂ« — "Mos fshij asgjĂ«, vetĂ«m riemĂ«rto. Interneti ruan GJITHÇKA"

Për më tepër, është gjithashtu e dëshirueshme të mos ri-shkruhen funksionet e ruajtura ekzistuese që punojnë me këtë entitet.

PĂ«r tĂ« realizuar kĂ«tĂ« koncept, tabela ka njĂ« atribut is_deleted. Pastaj gjithçka Ă«shtĂ« e thjeshtĂ« — duhet tĂ« bĂ«het nĂ« mĂ«nyrĂ« qĂ« klienti tĂ« mund tĂ« shohĂ« vetĂ«m rreshtat nĂ« tĂ« cilat atributi is_deleted Ă«shtĂ« i pavĂ«rtetĂ«. PĂ«r kĂ«tĂ«, pĂ«rdoret mekanizmi Row Level Security.

Implementimi

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

CREATE ROLE repos;
CREATE SCHEMA repos;

Krijojmë tabelën e synuar

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

Aktivizoni Row Level Security

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 ;

Funksioni shĂ«rbimit — fshirja e rreshtit nĂ« tabelĂ«

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;

Funksioni biznesor — fshirja e dokumentit

CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM  repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY 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 rows)

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 row)

Çka kĂ«rkonte nĂ« formulimin e detyrĂ«s.

Përfundimi

Nëse tema do të jetë interesante, në studimin e ardhshëm mund të tregohet një shembull realizimi të modelit të rolit të ndarjes së qasjes në të dhëna duke përdorur Row Level Security.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster