Utafiti juu ya kutekeleza Usalama wa Kiwango cha Mstari katika PostgreSQL

Kama nyongeza ya Utafiti wa kutekeleza mantiki ya biashara katika kiwango cha vitendaji vilivyohifadhiwa vya PostgreSQL ΠΈ hasa kwa jibu la kina juu ya ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ.

Sehemu ya kinadharia imeelezewa vizuri katika nyaraka PostgreSQL - Sera za ulinzi wa safu mlalo. Chini ni utekelezaji wa vitendo wa ndogo kazi maalum ya biashara - kuficha data iliyofutwa. Mchoro unaotolewa kwa utekelezaji Uigaji wa jukumu kwa kutumia RLS iliyotolewa tofauti.

Utafiti juu ya kutekeleza Usalama wa Kiwango cha Mstari katika PostgreSQL

Hakuna kitu kipya katika makala, hakuna maana iliyofichwa au ujuzi wa siri. Mchoro tu kuhusu utekelezaji wa vitendo wa wazo la kinadharia. Ikiwa mtu yeyote ana nia, soma. Ikiwa hupendi, usipoteze wakati wako.

Taarifa ya tatizo

Bila kupiga mbizi kwa undani katika eneo la somo, kwa ufupi, shida inaweza kupangwa kama ifuatavyo: Kuna jedwali linalotumia chombo fulani cha biashara. Safu mlalo kwenye jedwali zinaweza kufutwa, lakini safu mlalo haziwezi kufutwa; lazima zifichwe.

Kwa maana inasemwa: "Usifute chochote, ipe jina tena. Mtandao huhifadhi kila kitu"

Njiani, inashauriwa usiandike tena vitendaji vilivyohifadhiwa ambavyo vinafanya kazi na chombo hiki.

Ili kutekeleza dhana hii, meza ina sifa imefutwa. Kisha kila kitu ni rahisi - unahitaji kuhakikisha kwamba mteja anaweza kuona tu mistari ambayo sifa imefutwa uongo Utaratibu unaotumika ni nini? Usalama wa Kiwango cha Safu.

Utekelezaji

Unda jukumu tofauti na schema

CREATE ROLE repos;
CREATE SCHEMA repos;

Unda meza inayolengwa

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

Sisi ni pamoja na Usalama wa Kiwango cha Mstari

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 ;

Kazi ya huduma - kufuta safu kwenye jedwali

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;

Kazi ya biashara - kufuta hati

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

Matokeo

Mteja anafuta hati

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

Baada ya kufutwa, mteja haoni hati

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

Lakini katika hifadhidata hati haijafutwa, sifa tu inabadilishwa ni_del

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

Ambayo ndiyo ilihitajika katika taarifa ya tatizo.

Jumla ya

Ikiwa mada inavutia, katika somo linalofuata unaweza kuonyesha mfano wa kutekeleza kielelezo dhima cha kutenganisha ufikiaji wa data kwa kutumia Row Level Security.

Chanzo: mapenzi.com

Kuongeza maoni