利用ORACLE VPD實現使用者安全控制
對不同的使用者授予不同的資料訪問許可權,這在大型集中系統以及資料倉儲環境中
會經常用到,oracle從8i開始提供了VPD技術來從資料庫底層實現。
在這裡,演示使用者TEST只能看錶scott.emp中deptno=10的記錄,
使用者HR只能看deptno in (20,30)的記錄,其它使用者進去不做限制
1:建立使用者對應許可權表,模擬使用者授權情況
connect sys/xxxx as sysdba
SQL> create table user_privs(username varchar2(100),deptno number(2));
SQL> insert into user_privs(username,deptno) values ('TEST',10);
SQL> insert into user_privs(username,deptno) values ('HR',20);
SQL> insert into user_privs(username,deptno) values ('HR',30);
SQL> commit;
SQL> grant select on scott.emp to hr,test;
2:sys使用者下建立應用的上下文context
SQL> create context mezi_context using sys.mezi_security_context;
3:為應用上下文context定義一個包頭
Create Or Replace Package sys.mezi_security_context
Is
Procedure set_mezi_context;
End;
4:定義設定上下文context的包體
Create Or Replace Package Body sys.mezi_security_context
Is
Procedure set_mezi_context
Is
v_deptno Varchar2(100);
v_username Varchar2(100);
Begin
select username,wmsys.wm_concat(deptno) Into v_username,v_deptno
from user_privs
Where username=sys_context('userenv','session_user')
group by username;
If sys_context('userenv','session_user') In ('TEST','HR') Then
dbms_session.set_context('MEZI_CONTEXT','DEPTNO',v_deptno);
Else
Null;
End If;
Exception
When no_data_found Then
Null;
End;
End;
5:定義一個DB級別的AFTER LOGON trigger
CREATE OR REPLACE TRIGGER tri_mezi_security
AFTER LOGON ON DATABASE
BEGIN
sys.mezi_security_context.set_mezi_context;
End;
測試
SQL> connect test/test@db1
SQL> select sys_context('mezi_context','DEPTno') from dual;
SYS_CONTEXT('MEZI_CONTEXT','DE
--------------------------------------------------------------------------------
10
6:定義策略函式包頭
Create Or Replace Package SYS.mezi_security Is
Function set_deptno_where(OWNER VARCHAR2,OBJECT_NAME VARCHAR2)
Return Varchar2;
End;
7:定義策略函式應用包體
Create Or Replace Package Body SYS.mezi_security
Is
Function set_deptno_where(OWNER VARCHAR2,OBJECT_NAME VARCHAR2)
Return Varchar2
Is
Begin
If sys_context('USERENV','SESSION_USER') In ('TEST','HR') Then
Return 'deptno in ( '||sys_context('mezi_context','deptno')||')';
Else
Return '1=1';
End If;
End ;
End;
注意
/*+ 需要OWNER VARCHAR2,OBJECT_NAME VARCHAR2 此引數,否則報如下錯
SQL> SELECT * FROM SCOTT.EMP;
SELECT * FROM SCOTT.EMP
ORA-28112: ÎÞ·¨Ö´ÐвßÂÔº¯Êý
SQL> select MEZI_SECURITY.SET_DEPTNO_WHERE from dual;
SET_DEPTNO_WHERE
--------------------------------------------------------------------------------
deptno='20'
*/
8:
建立包mezi_security 的public synonym,並把execute許可權賦給public
create public synonym mezi_security for sys.mezi_security;
grant execute on mezi_security to public;
否則其它使用者無法執行策略函式
9:
對object應用策略
exec DBMS_RLS.ADD_POLICY(OBJECT_SCHEMA=>'SCOTT',OBJECT_NAME=>'EMP',POLICY_NAME=>'EMP_POLICY',FUNCTION_SCHEMA=>'SYS',POLICY_FUNCTION=>'MEZI_SECURITY.SET_DEPTNO_WHERE',ENABLE=>TRUE);
取消object的策略
EXEC DBMS_RLS.DROP_POLICY('SCOTT','EMP','EMP_POLICY');
10:
connect test/test 測試
connect hr/hr 測試
connect scott/tiger 測試
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10159839/viewspace-584287/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 利用Oracle VPD實現行級安全保護(二)Oracle
- 利用Oracle VPD實現行級安全保護(一)Oracle
- 利用VPD細粒度訪問策略實現行級安全性
- 利用VPD細粒度訪問策略實現行級安全性 Step By Step
- VPD策略實現行級安全性
- 利用FGAC/VPD重寫使用者SQLSQL
- 使用DBMS_RLS包實現列級VPD控制
- 利用Oracle許可實現更好控制Linux(轉)OracleLinux
- ORACLE VPD方案Oracle
- ORACLE VPD AND FGAOracle
- Oracle安全 - 虛擬專用資料庫 VPDOracle資料庫
- 【VPD】使用Oracle VPD(Virtual Private Database)限制使用者獲取資料的範圍OracleDatabase
- oracle VPD介紹Oracle
- Oracle vs PostgreSQL DBA(21)- Oracle VPDOracleSQL
- 利用Oracle FGA實現審計Oracle
- Spring Cloud Eureka 實現安全控制SpringCloud
- 利用VB實現對IE的呼叫與控制 (轉)
- 使用Oracle VPD(Virtual Private Database)實現資料庫層面資料許可權OracleDatabase資料庫
- Oracle vs PostgreSQL DBA(22)- Oracle VPD#2OracleSQL
- VPD--Virtual Private Database / Oracle PolicyDatabaseOracle
- 如何使用策略組來實現行級別的VPD
- 利用swagger和API Version實現api版本控制SwaggerAPI
- 安全測試---資源控制怎麼實現?
- 利用IPsec實現網路安全之五(Kerveros實現身份驗證)ROS
- 前端利用ajax實現使用者註冊頁面前端
- 利用oracle的日誌挖掘實現回滾Oracle
- 企業如何利用安全運營來實現業務現代化
- oracle 虛擬專用資料庫(VPD)Oracle資料庫
- 在JBOSS中實現使用者安全認證
- oracle利用scn增量備份來實現同步dataguardOracle
- 利用Oracle的全文索引實現切詞功能Oracle索引
- 利用IPsec實現網路安全之四(CA證書實現身份驗證)
- 利用Label Security實現行級安全性 Step By Step
- Oracle DV和OLS以及VPD的區別(轉)Oracle
- 利用ORACLE utl_stmp 包實現 mail傳送功能OracleAI
- Vue2-利用自定義指令實現按鈕許可權控制Vue
- SpringBoot框架整合SpringSecurity實現安全訪問控制Spring Boot框架Gse
- vpd contextContext