Usa ka pagtuon sa pagpatuman sa Row Level Security sa PostgreSQL

Isip komplemento sa Usa ka pagtuon sa pagpatuman sa lohika sa negosyo sa lebel sa PostgreSQL nga gitipigan nga mga gimbuhaton ΠΈ nag-una alang sa usa ka detalyado nga tubag sa usa ka komento.

Ang teoretikal nga bahin maayo nga gihulagway sa dokumentasyon PostgreSQL - Mga palisiya sa pagpanalipod sa linya. Sa ubos usa ka praktikal nga pagpatuman sa usa ka gamay piho nga buluhaton sa negosyo - pagtago sa mga natangtang nga datos. Sketch nga gipahinungod sa pagpatuman Role modeling gamit ang RLS gipresentar nga gilain.

Usa ka pagtuon sa pagpatuman sa Row Level Security sa PostgreSQL

Walay bag-o sa artikulo, walay tinago nga kahulogan o sekreto nga kahibalo. Usa lang ka sketch bahin sa praktikal nga pagpatuman sa usa ka teoretikal nga ideya. Kung adunay interesado, basaha kini. Kung dili ka interesado, ayaw usiki ang imong oras.

Pagbuot sa problema

Kung wala’y lawom nga pag-dive sa hilisgutan nga lugar, sa kadali, ang problema mahimong maporma sama sa mosunod: Adunay usa ka lamesa nga nagpatuman sa usa ka piho nga entidad sa negosyo. Ang mga laray sa lamesa mahimong mapapas, apan ang mga laray dili mahimong pisikal nga mapapas; kini kinahanglan itago.

Kay matod pa: β€œDon’t delete anything, just rename it. Gitipigan sa Internet ang TANAN"

Sa kadugayan, gitambagan nga dili isulat pag-usab ang naa na nga gitipigan nga mga gimbuhaton nga nagtrabaho sa kini nga entidad.

Aron ipatuman kini nga konsepto, ang lamesa adunay hiyas is_deleted. Dayon ang tanan yano ra - kinahanglan nimo nga sigurohon nga ang kliyente makakita lamang sa mga linya diin ang hiyas is_deleted bakak Para sa unsa ang mekanismo nga gigamit? Seguridad sa lebel sa linya.

Pagpatuman

Paghimo og bulag nga papel ug eskema

CREATE ROLE repos;
CREATE SCHEMA repos;

Paghimo sa target nga lamesa

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

Padayon Seguridad sa lebel sa linya

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 ;

Serbisyo function β€” pagtangtang sa usa ka laray sa lamesa

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;

Function sa negosyo - pagtangtang sa usa ka 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;

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹

Gitangtang sa kliyente ang dokumento

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

Human sa pagtangtang, ang kliyente dili makakita sa dokumento

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

Apan sa database ang dokumento wala mapapas, ang kinaiya lamang ang giusab is_del

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

Nga mao ang gikinahanglan sa pahayag sa problema.

Ang resulta

Kung ang hilisgutan makapaikag, sa sunod nga pagtuon mahimo nimong ipakita ang usa ka pananglitan sa pagpatuman sa usa ka modelo nga gibase sa papel alang sa pagbulag sa pag-access sa datos gamit ang Row Level Security.

Source: www.habr.com

Idugang sa usa ka comment