Yon etid sou aplikasyon Row Level Security nan PostgreSQL

Kòm yon konpleman nan Yon etid sou aplikasyon lojik biznis nan nivo fonksyon ki estoke PostgreSQL и sitou pou yon repons detaye sou kòmantè.

Pati teyorik la byen dekri nan dokiman an PostgreSQL - Règleman pwoteksyon ranje. Anba a se yon aplikasyon pratik nan yon ti travay espesifik biznis - kache done efase. Sketch dedye a aplikasyon Modèl wòl lè l sèvi avèk RLS prezante separeman.

Yon etid sou aplikasyon Row Level Security nan PostgreSQL

Pa gen anyen nouvo nan atik la, pa gen okenn siyifikasyon kache oswa konesans sekrè. Jis yon chema sou aplikasyon an pratik nan yon lide teyorik. Si yon moun enterese, li li. Si ou pa enterese, pa pèdi tan ou.

Deklarasyon sou pwoblèm nan

San yo pa plonje pwofondman nan sijè a, yon ti tan, pwoblèm nan ka formul jan sa a: Gen yon tab ki aplike yon sèten antite biznis. Ranje nan tablo a ka efase, men ranje yo pa ka efase fizikman; yo dwe kache.

Paske yo di: "Pa efase anyen, jis chanje non li. Entènèt la sere tout bagay"

Sou wout la, li rekòmande pou pa reekri fonksyon ki deja estoke ki travay ak antite sa a.

Pou aplike konsèp sa a, tab la gen atribi a se_deleted. Lè sa a, tout bagay se senp - ou bezwen asire w ke kliyan an ka wè sèlman liy yo nan ki atribi a. se_deleted fo Pou kisa mekanis yo itilize? Ranje Nivo Sekirite.

Aplikasyon

Kreye yon wòl separe ak chema

CREATE ROLE repos;
CREATE SCHEMA repos;

Kreye tab sib la

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

Nou genyen ladan yo Ranje Nivo Sekirite Sosyal

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 ;

Fonksyon sèvis — efase yon ranje nan tablo a

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;

Fonksyon biznis - efase yon dokiman

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

Jwenn

Kliyan an efase dokiman an

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

Apre efase, kliyan an pa wè dokiman an

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

Men, nan baz done a dokiman an pa efase, se sèlman atribi a chanje is_del

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

Ki sa ki te egzije nan deklarasyon pwoblèm lan.

Total

Si sijè a enteresan, nan pwochen etid la ou ka montre yon egzanp sou aplikasyon yon modèl ki baze sou wòl pou separe aksè done lè l sèvi avèk Row Level Security.

Sous: www.habr.com

Add nouvo kòmantè