Isang pag-aaral sa pagpapatupad ng Row Level Security sa PostgreSQL

Bilang pandagdag sa Isang pag-aaral sa pagpapatupad ng lohika ng negosyo sa antas ng PostgreSQL stored functions ΠΈ higit sa lahat para sa isang detalyadong sagot sa komentaryo.

Ang teoretikal na bahagi ay mahusay na inilarawan sa dokumentasyon PostgreSQL - Mga patakaran sa proteksyon ng hilera. Nasa ibaba ang isang praktikal na pagpapatupad ng isang maliit tiyak na gawain sa negosyo - pagtatago ng tinanggal na data. Sketch na nakatuon sa pagpapatupad Role modeling gamit ang RLS hiwalay na ipinakita.

Isang pag-aaral sa pagpapatupad ng Row Level Security sa PostgreSQL

Walang bago sa artikulo, walang nakatagong kahulugan o lihim na kaalaman. Isang sketch lamang tungkol sa praktikal na pagpapatupad ng isang teoretikal na ideya. Kung may interesado, basahin ito. Kung hindi ka interesado, huwag mag-aksaya ng oras.

Pahayag ng problema

Nang walang malalim na pagsisid sa lugar ng paksa, sa madaling sabi, ang problema ay maaaring mabalangkas tulad ng sumusunod: Mayroong isang talahanayan na nagpapatupad ng isang partikular na entity ng negosyo. Maaaring tanggalin ang mga hilera sa talahanayan, ngunit ang mga hilera ay hindi maaaring pisikal na tanggalin; dapat silang itago.

Dahil sabi nga: β€œHuwag magtanggal ng kahit ano, palitan mo lang ng pangalan. Iniimbak ng Internet ang LAHAT"

Kasabay nito, ipinapayong huwag muling isulat ang mga umiiral nang nakaimbak na function na gumagana sa entity na ito.

Upang ipatupad ang konseptong ito, ang talahanayan ay may katangian is_deleted. Pagkatapos ang lahat ay simple - kailangan mong tiyakin na makikita lamang ng kliyente ang mga linya kung saan ang katangian is_deleted mali Para saan ang mekanismong ginagamit? Seguridad sa Antas ng Row.

Pagpapatupad

Gumawa ng hiwalay na tungkulin at schema

CREATE ROLE repos;
CREATE SCHEMA repos;

Lumikha ng target na talahanayan

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

Isinasama namin Seguridad sa Antas ng Hilera

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 ;

Pag-andar ng serbisyo β€” pagtanggal ng row sa table

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;

Pag-andar ng negosyo β€” pagtanggal ng dokumento

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

Natuklasan

Tinatanggal ng kliyente ang dokumento

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

Pagkatapos ng pagtanggal, hindi nakikita ng kliyente ang dokumento

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

Ngunit sa database ang dokumento ay hindi tinanggal, tanging ang katangian ay binago ay_del

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

Alin ang kinakailangan sa pahayag ng problema.

Kabuuan

Kung ang paksa ay kawili-wili, sa susunod na pag-aaral maaari kang magpakita ng isang halimbawa ng pagpapatupad ng isang role-based na modelo para sa paghihiwalay ng access ng data gamit ang Row Level Security.

Pinagmulan: www.habr.com

Magdagdag ng komento