Oracle рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐рдпрд╛рдВ

рдЗрд╕ рдЕрдиреБрдЪреНрдЫреЗрдж рдореЗрдВ, рдореИрдВ рдПрдХ рдРрд╕реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдЖрдкрдХреЛ DBMS рд╕реНрддрд░ рдкрд░ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╛рдзрд╛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реНрд╡рдпрдВ рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ рд╡рд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдг рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╣реИрдВред Oracle 11g R2 рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ SCOTT рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреБрдЫ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдкреНрд░рддрд┐рдмрдВрдз рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬрд┐рди рдорд╛рдирджрдВрдбреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВред


рд╣рдо SCOTT рдХреА рдУрд░ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрдЧреА, рдЬрд┐рдирдХреА рдкрд╣реБрдВрдЪ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рд╕реНрд╡рдпрдВ рдбреЗрдЯрд╛:

CREATE TABLE scott.user_allowed ( ua_id NUMBER, oracle_user VARCHAR2(50) ); Table created. insert into scott.user_allowed (ua_id, oracle_user) values (1, 'SCOTT'); insert into scott.user_allowed (ua_id, oracle_user) values (2, 'OTHERUSER'); 1 row created. 1 row created. commit; CREATE TABLE scott.user_data ( ud_id NUMBER, ud_user_id NUMBER, ud_data VARCHAR2(2000) ); Table created. insert into scott.user_data (ud_id, ud_user_id, ud_data) values (1, 1, 'SCOTT DATA'); insert into scott.user_data (ud_id, ud_user_id, ud_data) values (2, 2, 'OTHERUSER DATA'); 1 row created. 1 row created. commit; select ud_id, ud_user_id, ud_data from user_data; 2 rows selected. 


рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЧрдпрд╛ред рдЕрдм, SYS рдХреА рдУрд░ рд╕реЗ рд╕рдВрдмрдВрдз рдмрдирд╛рдПрдВ, рд╕рдорд░реНрдкрд┐рдд рдХрд╛рд░реНрдп рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐ рдмрдирд╛рдПрдВ:

 CREATE OR REPLACE FUNCTION sys.scott_predicate_allow ( obj_schema IN VARCHAR2, obj_name IN VARCHAR2 ) RETURN VARCHAR2 IS BEGIN return 'ud_id in (SELECT ud_id FROM scott.user_data ud, scott.user_allowed ua WHERE ud.ud_user_id = ua.ua_id AND upper(ua.oracle_user) = upper(USER))'; END scott_predicate_allow; / Function created. 


 BEGIN SYS.DBMS_RLS.ADD_POLICY ( Object_schema => 'SCOTT' ,Object_name => 'USER_DATA' ,policy_name => 'SCOTT_ALLOW_USER_DATA' ,function_schema => 'SYS' ,policy_function => 'SCOTT_PREDICATE_ALLOW' ,statement_types => 'SELECT,INSERT,UPDATE,DELETE,INDEX ' ,policy_type => dbms_rls.dynamic ,long_predicate => FALSE ,sec_relevant_cols => 'UD_ID,UD_USER_ID,UD_DATA' ,sec_relevant_cols_opt => NULL ,update_check => FALSE ,enable => TRUE ); END; / PL/SQL procedure successfully completed. 


USER_ALLOWED рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдЕрдиреБрд╕рд╛рд░, USER_DATA рддрд╛рд▓рд┐рдХрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░, SCOTT рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдХреЗрд╡рд▓ рд╡рд╣ рдбреЗрдЯрд╛ рджреЗрдЦреЗрдВрдЧреЗ, рдЬреЛ рдХреЗрд╡рд▓ ud_user_id рдХреЙрд▓рдо рдореЗрдВ рд╣реИред рдпрд╣ рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ, рдлрд┐рд░ рд╕реЗ SCOTT рдФрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ:

 select ud_id, ud_user_id, ud_data from user_data; ORA-28113: policy predicate has error 


рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рддреНрд░реБрдЯрд┐ рдХреНрдпрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЯреНрд░реЗрд╕ рдлрд╝рд╛рдЗрд▓ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рд╣реИ:

 ORA-28108: circular security policies detected 


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдореЗрдВ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдХрд╣реВрдВрдЧрд╛ред рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ... рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЖрдЬрд╝рдорд╛рдПрдБ, рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред рдЖрдЗрдП SYS рдХреА рдУрд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

 create or replace type sys.number_table is table of number; / Type created. CREATE OR REPLACE PACKAGE SYS.SCOTT_ALLOWED AS allowed_id number_table:=number_table(); function get_allowed_id return number_table; END SCOTT_ALLOWED; / Package created. CREATE OR REPLACE PACKAGE BODY SYS.SCOTT_ALLOWED AS function get_allowed_id return number_table is begin return allowed_id; end; END SCOTT_ALLOWED; / Package body created. CREATE OR REPLACE FUNCTION sys.scott_predicate_allow ( obj_schema IN VARCHAR2, obj_name IN VARCHAR2 ) RETURN VARCHAR2 IS BEGIN scott_allowed.allowed_id:=number_table(); select ud_id bulk collect into scott_allowed.allowed_id from scott.user_data ud, scott.user_allowed ua where ud.ud_user_id = ua.ua_id and upper(ua.oracle_user) = upper(USER); return 'EXISTS (SELECT 1 FROM TABLE(scott_allowed.get_allowed_id) a WHERE a.column_value = ud_id)'; END scott_predicate_allow; / Function created. 


рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рдереА рдХрд┐ рдПрдХ рдирдпрд╛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ рдЬреЛ рдЯрд╛рдЗрдк рдирдВрдмрд░ рдХреА рдПрдХрд▓-рд╕реНрддрдВрдн рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреИрдХреЗрдЬ рдЪрд░ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдПрдЧреАред рдкреИрдХреЗрдЬ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЖрд╡рд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдмреИрдХ рдбреЗрдЯрд╛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рддреНрд░ рдХреЗ рдмреАрдЪ рдкреИрдХреЗрдЬ рдЪрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╡рд┐рдзреЗрдп рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдХрд░реНрд╕рд░ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рддрд╛рд▓рд┐рдХрд╛ рдХреА рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рдЙрддреНрдкрдиреНрди рдмрд╛рдзрд╛ рдХреЛ EXISTS рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рд╣реИред

рдЕрдм SCOTT рдХреА рдУрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдХреЗ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ:

 select ud_id, ud_user_id, ud_data from user_data; 1 row selected. 

Source: https://habr.com/ru/post/In159413/


All Articles