八、dbms_rls(實現精細訪問控制)


1、概述


本報只適用於Oracle Enterprise Edition,它用於實現精細訪問控制,並且精細訪問控制是通過在SQL語句中動態增加謂詞(WHERE子句)來實現的.
通過使用ORACLE的精細訪問控制特征,可以使不同數據庫用戶在執行相同SQL語句時操作同一張表上的不同數據.
例如多個用戶執行select * from emp時,各自看到的行數不同。A只能看到財務部的記錄,B只能看到市場部的數據。

2、包的組成

1)、add_policy
作用:用於為表、視圖或同義詞增加一個安全策略,當執行該操作結束是會自動提交事務。
語法dbms_rls.add_policy(
object_aschema in varchar2 null,
object_name in varchar2,
policy_name in varchr2,
function_schema in varchar2 null,
policy_function in varchar2,
statement_type in varchar2 null,
update_check in boolean false,
enable in boolean true,
static_policy in boolean false);
其中

  • object_aschema:指定包含表、視圖或同義詞的方案(默認null表示當前方案),
  • object_name:指定要增加安全策略的表、視圖或同義詞,
  • policy_name:指定要增加的安全策略名稱,
  • function_schema:指定策略函數的所在方案(默認null表示當前方案),
  • policy_function:指定生成安全策略謂詞的函數名,
  • statement_type:指定使用安全策略的sql語句(默認null表示適用於select、insert、update、delete),
  • update_check:指定執行insert、update時是否檢查安全策略,
  • enable:指定是否要激活安全策略,
  • static_policy:指定是否要生成靜態的安全策略。


2)、drop_policy
作用:用於刪除定義在特定表、視圖或同義詞的安全策略,當試行該操作結束時會自動提交事務。
語法:dbms_rls.drop_policy(
object_achema in varchr2 null,
object_name in varchar2,
policy_name in varchar2);

3)、refresh_policy
作用:用於刷新與安全策略修改相關的所有sql語句,並使得Oracle重新解析相關sql語句,自動提交。
語法:dbms_rls.refresh_policy(
object_achema in varchr2 null,
object_name in varchar2 null,
policy_name in varchar2 null);

4)、enable_policy
說明:用於激活或禁止特定的安全策略,默認情況下當增加安全策略時會自動激活,自動提交。
語法:dbms_rls.enable_policy(
object_achema in varchr2 null,
object_name in varchar2,
policy_name in varchar2,
enable in boolean);

5)、create_policy_group
作用:用於建立安全策略組
語法:dbms_rls.create_policy_group(object_schema varchar2, object_name varchar2,policy_group varchar2);
其中policy_group指定策略組的名稱。

6)、add_grouped_policy
作用:用於增加與特定策略組相關的安全策略。
語法:dbms_rls.add_grouped_policy(object_schema varchar2, object_name varchar2,policy_group varchar2,policy_name varchar2,
function_schema varchar2,policy_function varchar2,statement_types varchar2,update_check boolean,enabled boolean,static_policy boolean false);

7)、add_policy_context
作用:用於為應用增加上下文
語法:dbms_rls.add_policy_context(object_schema varchar2,object_name varchar2,namespace varchar2,attribute varchar2);
其中namespace指定命名空間,attribute指定上下文屬性。

8)、delete_policy_group
作用:用於刪除安全策略組
語法:dbms_rls.delete_policy_group(object_schema varchar2,object_name varchar2,policy_group varchar2);

9)、drop_grouped_policy
作用:用於刪除特定策略組的安全策略。
語法:dbms_rls.drop_grouped_policy(object_schema varchar2,object_name varchar2,policy_group varchar2,policy_name varchar2);

10)、drop_policy_context
作用:用於刪除對象的上下文。
語法:dbms_rls.drop_policy_context(object_schema varchar2,object_name varchar2,namespace varchar2,attribute varchar2);

11)、enable_grouped_policy
作用:用於激活或禁止特定策略組的安全策略
語法:dbms_rls.enable_grouped_policy(object_schema varchar2,object_name varchar2,group_name varchar2,policy_name varchar2,enable boolean);

12)、refresh_grouped_policy
作用:用於刷新與特定安全策略組的安全策略相關的sql語句(重新解析sql語句)
語法:dbms_rls.refresh_grouped_policy(object_schema varchar2,object_name varchar2,group_name varchar2,policy_name varchar2);

3、使用dbms_rls實現精細訪問控制


假設希望sys、system、scott用戶可以訪問emp表的所有員工,blake用於智能訪問部門30的員工,jones用戶只能訪問部門20的員工,其他用戶只能訪問部門10的員工。

步驟如下
1)、建立應用上下文
說明:要求用戶必須具有create any context系統權限。
create or replace context empenv using scott.ctx;--建立名稱為empenv的應用上下文,其屬性有scott方案的包ctx包設置。

2)、建立包過程設置應用上下文屬性
create or replace package scott.ctx as
procedure set_deptno;
end;
create or replace package body scott.ctx as
procedure set_deptno is
id number;
begin
if sys_context('userenv','session_user')='JONES' then
dbms_session.set_context('empenv','deptno',20);
elsif sys_context('userenv','session_user')='BLAKE' then
dbms_session.set_context('empenv','deptno',30);
else
dbms_session.set_context('empenv','deptno',10);
end if;
end;
end;

3)、建立登錄觸發器
說明:用戶登錄數據庫之后會自動觸發登陸觸發器,建立登錄觸發器的目的是要隱含調用過程ctx.set_deptno,從而設置上下文屬性。必須要以sys用戶身份建立登陸觸發器。
conn sys/oracle as sysdba
create or replace trigger login_trig
after logon on database call scott.ctx.set_deptno

4)、建立策略函數
策略函數必須帶有2個參數,第一個參數對應於方案名,第二個參數對應於表名、視圖名、同義詞名。
create or replace package scott.emp_security as
function emp_sec(p1 varchar2,p2 varchar2) return varchar2;
end;
create or replace package body scott.emp_security ad
function emp_sec(p1 varchar2,p2 varchar2) return varchar2
is
d_predicate varchar2(2000);
begin
if user not in ('SYS','SYSTEM','SCOTT') then
d_predicate:='deptno=SYS_CONTEXT(''empenv'',''deptno'')'
return d_predicate;
end if;
return '1=1';
end;
end;

5)、增加策略
說明:增加策略,並定義對象、策略、策略函數以及SQL語句之間的對應關系。
execute dbms_rls.add_policy('scott','emp','emp_policy','scott','emp_security.emp_sec','select');
執行add_policy后會在系統默認策略組sys_default中增加策略emp_policy,並在scott.emp上的select語句使用該策略。
其中第一個參數是對象所在方案名,第二個參數是對象名,第三個參數是策略名,第四個參數策略函數所在的方案名,
第五個參數時策略函數,第六個參數是使用該策略的sql語句(如果不指定則select,insert,ypdate,delete都會使用該策略)

當SYS,SYSTEM,SCOTT登錄查詢,謂詞為1=1,當JONES登陸謂詞為deptno=20,當blake登陸謂詞為deptno=30。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM