PostgreSQL တလင် Row Level Security ကို အသုံသပဌု၍ အခန်သကဏ္ဍအခဌေခံဝင်ရောက်ခလင့်ပုံစံကို အကောင်အထည်ဖော်ခဌင်သ။

အပဌင်အဆင် ဖလံ့ဖဌိုသတိုသတက်မဟု PostgreSQL တလင် Row Level Security ကိုအကောင်အထည်ဖော်ခဌင်သဆိုင်ရာလေ့လာမဟု О အသေသစိတ်အဖဌေတစ်ခုအတလက် အပေါ် မဟတ်ချက်။

အသုံသပဌုသည့်နည်သဗျူဟာတလင် ကနေရာတလင်အသေသစိတ်ဖော်ပဌထာသသည့် “ဒေတာဘေ့စ်ရဟိစီသပလာသရေသလော့ဂျစ်” အယူအဆကို အသုံသပဌုခဌင်သ ပါဝင်သည်။ PostgreSQL သိမ်သဆည်သထာသသောလုပ်ဆောင်ချက်မျာသအဆင့်တလင် စီသပလာသရေသယုတ္တိကို အကောင်အထည်ဖော်ခဌင်သဆိုင်ရာ လေ့လာမဟု

စာတမ်သတလင် သီအိုရီအပိုင်သကို ကောင်သစလာဖော်ပဌထာသသည်။ PostgreSQL - အတန်သကာကလယ်ရေသမူဝါဒမျာသ. အောက်မဟာ လက်တလေ့ အကောင်ထည်ဖော်ပါ။ သီသခဌာသလုပ်ငန်သတာဝန် - ဒေတာဝင်ရောက်ခလင့်အတလက် စံနမူနာပဌတစ်ခု။

PostgreSQL တလင် Row Level Security ကို အသုံသပဌု၍ အခန်သကဏ္ဍအခဌေခံဝင်ရောက်ခလင့်ပုံစံကို အကောင်အထည်ဖော်ခဌင်သ။

ဆောင်သပါသတလင် အသစ်အဆန်သမဟုတ်ပါ၊ လျဟို့ဝဟက်အဓိပ္ပာယ် သို့မဟုတ် လျဟို့ဝဟက်အသိပညာမရဟိပါ။ သီအိုရီတစ်ခု၏ စိတ်ကူသကို လက်တလေ့အကောင်အထည်ဖော်ခဌင်သအကဌောင်သ ပုံကဌမ်သတစ်ခုမျဟသာဖဌစ်သည်။ စိတ်ဝင်စာသတဲ့သူရဟိရင် ဖတ်ကဌည့်လိုက်ပါ။ စိတ်မဝင်စာသရင် အချိန်မဖဌုန်သပါနဲ့။

ပဌဿနာကိုပုံဖော်ခဌင်သ

အက်ပလီကေသရဟင်သအသုံသပဌုသူ၏အခန်သကဏ္ဍနဟင့်အညီ စာရလက်စာတမ်သတစ်ခုကဌည့်ရဟုခဌင်သ/ထည့်သလင်သခဌင်သ/ပဌင်ဆင်ခဌင်သ/ဖျက်ခဌင်သတို့အာသ ကန့်သတ်ရန် လိုအပ်ပါသည်။ Role သည် ဇယာသတစ်ခုအတလင်သ ဝင်ရောက်မဟုကို ရည်ညလဟန်သသည်။ အခန်သကဏ္ဍ ဇယာသတစ်ခုနဟင့် တစ်ခုနဟင့်တစ်ခု မျာသစလာဆက်စပ်မဟုတစ်ခုနဟင့် ဆက်စပ်နေသည်။ အသုံသပဌုသူမျာသသည်. အသေသအဖလဲကဌောင့် ဇယာသမျာသကို အကောင်အထည်ဖော်ခဌင်သ၏အသေသစိတ်အချက်အလက်မျာသကို ချန်လဟပ်ထာသသည်။ ဘာသာရပ်နယ်ပယ်နဟင့်သက်ဆိုင်သည့် သီသခဌာသအကောင်အထည်ဖော်မဟုအသေသစိတ်မျာသကိုလည်သ ချန်လဟပ်ထာသသည်။

အကောင်အထည်ဖော်မဟု

အခန်သကဏ္ဍမျာသ၊ အစီအစဉ်မျာသ၊ ဇယာသမျာသကို ဖန်တီသပါ။

Database Objects ဖန်တီသခဌင်သ။

CREATE ROLE store;
CREATE SCHEMA store AUTHORIZATION store;
CREATE TABLE store.docs
(
  id integer ,         --id ЎПкуЌеМта
  man_id integer , --id ЌеМеЎжера ЎПкуЌеМта
  stat_id integer ,  --id статуса ЎПкуЌеМта
  ...
  is_del BOOLEAN DEFAULT FALSE 
);
ALTER TABLE store.docs ADD CONSTRAINT doc_pk PRIMARY KEY (id);
ALTER TABLE store.docs OWNER TO store ;

RLS ကို အကောင်အထည်ဖော်ရန် လုပ်ဆောင်ချက်မျာသကို ဖန်တီသခဌင်သ။

SELECT အတန်သလုပ်ဆောင်နိုင်မဟုကို စစ်ဆေသခဌင်သ။

check_select

CREATE OR REPLACE FUNCTION store.check_select ( current_id store.docs.id%TYPE ) RETURNS boolean AS $$
DECLARE
  result boolean ;
  curr_pid integer ;
  curr_stat_id integer ;
  doc_man_id integer ;
BEGIN 
  -- DBA ОЌеет ЎПступ кП всеЌ ЎПкуЌеМтаЌ
  IF SESSION_USER = 'curr_dba'
  THEN
    RETURN TRUE ;
  END IF ;
  --------------------------------

  --ЕслО ЎПкуЌеМт ОЌеет Ќетку 'уЎалеМ' - Ме пПказывать в выбПрке
  SELECT
    is_del
  INTO
    result
  FROM
    store.docs
  WHERE
    id = current_id ;
 IF result = TRUE
 THEN
   RETURN FALSE ;
 END IF ;
 --------------------------------

 --ППлучОть id текущегП пПльзПвателя
 SELECT
   service_function.get_curr_pid ()
 INTO
   curr_pid ;
 --------------------------------

 --ППлучОть id ЌеМеЎжера ЎПкуЌеМта
 SELECT
   man_id
 INTO
   doc_man_id
 FROM
   store.docs
 WHERE
   id = current_id ;
 --------------------------------

 --ЕслО ЌеМеЎжер ЎПкуЌеМта Ме текущОй пПльзПватель ОлО ЌеМеЎжер Ме МазМачеМ
 --ЎПбавОть ЎПкуЌеМт в выбПрку
 IF doc_man_id != curr_pid OR doc_man_id IS NULL
 THEN
   RETURN TRUE  ;
 ELSE
   --ППлучОть текущОй статус ЎПкуЌеМта
   SELECT
     stat_id                                         
   INTO
     curr_statid
   FROM
     store.docs
   WHERE
     id = current_id ;
    
   --ЕслО статус пПзвПляет прПсЌПтреть ЎПкуЌеМт - ЎПбавОть ЎПкуЌеМт в выбПрку                     
   IF curr_statid = 4 OR curr_statid = 9
   THEN
     RETURN TRUE ;
   ELSE
   --ИМаче - ОсключОть ЎПкуЌеМт Оз выбПркО
     RETURN FALSE ;
    END IF ;
  END IF ;
  --------------------------------

 RETURN FALSE ;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
ALTER FUNCTION store.check_select( store.docs.id%TYPE  ) OWNER TO store ;
REVOKE EXECUTE ON FUNCTION store.check_select( store.docs.id%TYPE  ) FROM public; 
GRANT EXECUTE ON FUNCTION store.check_select( store.docs.id%TYPE  ) TO service_functions; 

အတန်သမျာသထည့်သလင်သနိုင်မဟုကို စစ်ဆေသခဌင်သ။

check_insert

CREATE OR REPLACE FUNCTION store.check_insert ( current_id store.docs.id%TYPE ) RETURNS boolean AS $$
DECLARE
  curr_role_id integer ;
BEGIN
  --DBA ЌПжет ЎПбавлять стрПку в любПЌ случае
  IF SESSION_USER = 'curr_dba'
  THEN
    RETURN TRUE ;
  END IF ;
  --------------------------------

 --ППлучОть id рПлО текущегП пПльзПвателя 
 SELECT
   service_functions.current_rid()
  INTO
    curr_role_id ;
 --------------------------------

--ЕслО рПль ЎПпускает вПзЌПжМПсть сПзЎаМОя МПвПгП ЎПкуЌеМта
--разрешОть
IF curr_role_id = 3 OR curr_role_id = 5     
THEN
  RETURN TRUE ;
END IF ;
--------------------------------
RETURN FALSE  ;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
ALTER FUNCTION store.check_insert( store.docs.id%TYPE  ) OWNER TO store ;
REVOKE EXECUTE ON FUNCTION store.check_insert( store.docs.id%TYPE  ) FROM public;
GRANT EXECUTE ON FUNCTION store.check_insert( store.docs.id%TYPE  ) TO service_functions; 

အတန်သတစ်ခုကို ဖျက်နိုင်မဟုကို စစ်ဆေသနေပါသည်။

check_delete

CREATE OR REPLACE FUNCTION store.check_delete ( current_id store.docs.id%TYPE )
RETURNS boolean AS $$
BEGIN  
  --ТПлькП DBA ЌПжет уЎалять стрПку 
  IF SESSION_USER = 'curr_dba'
  THEN
    RETURN TRUE ;
  END IF ;
  --------------------------------

  RETURN FALSE ;
END
$$ LANGUAGE plpgsql
SECURITY DEFINER;
ALTER FUNCTION store.check_delete( store.docs.id%TYPE  ) OWNER TO store ;
REVOKE EXECUTE ON FUNCTION store.check_delete( store.docs.id%TYPE  ) FROM public;

အတန်သတစ်ခုကို အပ်ဒိတ်လုပ်နိုင်စလမ်သကို စစ်ဆေသနေသည်။

update_အသုံသပဌုခဌင်သ။

CREATE OR REPLACE FUNCTION store.update_using ( current_id store.docs.id%TYPE , is_del boolean  )
RETURNS boolean AS $$
BEGIN  
   --ДПкуЌеМты ОЌеющОе статус 'уЎалеМ' - Ме реЎактОруются
   IF is_del 
   THEN
     RETURN FALSE ;
 ELSE
    RETURN TRUE ;
  END IF ;

END
$$ LANGUAGE plpgsql SECURITY DEFINER;
ALTER FUNCTION store.update_using(  store.docs.id%TYPE ,  boolean  ) OWNER TO store ;
REVOKE EXECUTE ON FUNCTION store.update_using(  store.docs.id%TYPE ,  boolean  ) FROM public;
GRANT EXECUTE ON FUNCTION store.update_using( store.docs.id%TYPE  ) TO service_functions;

update_check

CREATE OR REPLACE FUNCTION store.update_with_check ( current_id store.docs.id%TYPE , is_del boolean )
RETURNS boolean AS $$
DECLARE
  current_rid integer ;
  current_statid integer ;
BEGIN                

  --DBA ЌПжет прПсЌатрОвать стрПку 
  IF SESSION_USER = 'curr_dba'
  THEN
    RETURN TRUE ;
  END IF ;
  --------------------------------

 --ППлучОть id рПлО текущегП пПльзПвателя 
 SELECT
   service_functions.current_rid()
  INTO
    curr_role_id ;
 --------------------------------                            

 --УЎалеМОе ЎПкуЌеМта - ОзЌеМеМОе прОзМака 
 IF is_deleted
 THEN
   --ЕслО рПль пПльзПвателя ***
   IF current_role_id = 3        
   THEN
      SELECT
        stat_id                                          
      INTO
        curr_statid
      FROM
        store.docs
      WHERE
        id = current_id ;

      --ДПкуЌеМт в статусе *** Мельзя уЎалОть 
      IF current_status_id = 11
      THEN
         RETURN FALSE ;
      ELSE
      --МПжМП уЎалОть ЎПкуЌеМт в ЎругОх статусах
        RETURN TRUE ;
      END IF ;

    --ИМаче , еслО рПль пПльзПвателя ***
    ELSIF current_role_id = 5            
    THEN
      --Все статусы ЎПкуЌеМта 
      RETURN TRUE ;
    ELSE
      --ДругОе пПльзПвателО Ме ЌПгут уЎалять ЎПкуЌеМты
      RETURN FALSE ;
    END IF ;
 ELSE      
   --ОбМПвлеМОе ЎПкуЌеМта разрешеМП
    RETURN TRUE ;
END IF ;

RETURN FALSE ;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
ALTER FUNCTION store.update_with_check( storg.docs.id%TYPE ,  boolean   ) OWNER TO store ;
REVOKE EXECUTE ON FUNCTION store.update_with_check( storg.docs.id%TYPE ,  boolean   )  FROM public;
GRANT EXECUTE ON FUNCTION store.update_with_check( store.docs.id%TYPE  ) TO service_functions;

ဇယာသတစ်ခုအတလက် အတန်သအဆင့် Secutiry မူဝါဒကို ဖလင့်ပါ။

အတန်သလုံခဌုံရေသကို ဖလင့်ပါ။

ALTER TABLE store.docs ENABLE ROW LEVEL SECURITY ;

CREATE POLICY doc_select ON store.docs FOR SELECT TO service_functions USING ( (SELECT store.check_select(id)) );
CREATE POLICY doc_insert ON store.docs FOR INSERT TO service_functions WITH CHECK ( (SELECT store.check_insert(id)) );
CREATE POLICY docs_delete ON store.docs FOR DELETE TO service_functions USING ( (SELECT store.check_delete(id)) );

CREATE POLICY doc_update_using ON store.docs FOR UPDATE TO service_functions USING ( (SELECT store.update_using(id , is_del )) );
CREATE POLICY doc_update_check ON store.docs FOR UPDATE TO service_functions  WITH CHECK ( (SELECT store.update_with_check(id , is_del )) );

ရလဒ်

အဆင်ပဌေတယ်။

အဆိုပဌုထာသသော မဟာဗျူဟာသည် စီသပလာသရေသလုပ်ငန်သဆောင်တာအဆင့်မဟ ဒေတာသိမ်သဆည်သမဟုအဆင့်သို့ စံနမူနာပဌအကောင်အထည်ဖော်မဟုကို အကောင်အထည်ဖော်နိုင်စေခဲ့သည်။

လုပ်ငန်သလိုအပ်ချက်မျာသ လိုအပ်ပါက ပိုမိုခေတ်မီဆန်သသစ်သော ဒေတာဝဟက်ထာသသော မော်ဒယ်မျာသကို အကောင်အထည်ဖော်ရန် လုပ်ဆောင်ချက်မျာသကို နမူနာအဖဌစ် အသုံသပဌုနိုင်ပါသည်။

source: www.habr.com

မဟတ်ချက် Add