日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Oracle VPD實現(xiàn)數(shù)據(jù)細粒度訪問(更好的權限控制)

 guolijiegg 2012-01-18

Oracle VPD實現(xiàn)數(shù)據(jù)細粒度訪問(更好的權限控制)

分類: Oracle 480人閱讀 評論(0) 收藏 舉報

虛擬專用數(shù)據(jù)庫 (VPD) 提供了角色和視圖無法提供的行級訪問控制。對于互聯(lián)網(wǎng)訪問,虛擬專用數(shù)據(jù)庫可以確保在線銀行的客戶只能看到他們自己的帳戶。Web 托管公司可以在同一 Oracle 數(shù)據(jù)庫中維護多個公司的數(shù)據(jù),但只允許每個公司查看其自身數(shù)據(jù)。

在企業(yè)內部,虛擬數(shù)據(jù)庫可在應用程序部署方面降低擁有成本。可以在數(shù)據(jù)庫服務器一次實現(xiàn)安全性,而不用在訪問數(shù)據(jù)的每個應用程序中分別實現(xiàn)安全性。因為是在數(shù)據(jù)庫中實施安全性,所以不管用戶訪問數(shù)據(jù)的方式如何,安全性較以前更高。訪問即席查詢工具或新報表生成程序的用戶不再能繞過安全環(huán)節(jié)。虛擬專用數(shù)據(jù)庫是一項重要技術,使企業(yè)能夠構建托管的、基于 Web 的應用程序。實際上,許多 Oracle 應用程序本身使用 VPD 實施數(shù)據(jù)分隔,包括 Oracle SalesOnline.com 和 Oracle Portal 等程序。

虛擬專用數(shù)據(jù)庫如何工作

將一個或多個安全策略與表或視圖關聯(lián)后,就可以實現(xiàn)虛擬專用數(shù)據(jù)庫。對帶安全策略的表進行直接或間接訪問時,數(shù)據(jù)庫將調用一個實施該策略的函數(shù)。策略函數(shù)返回一個訪問條件(WHERE 子句),即謂詞。應用程序將它附加到用戶的 SQL 語句,從而動態(tài)修改用戶的數(shù)據(jù)訪問權限。

你可以通過編寫一個存儲過程將 SQL 謂詞附加到每個 SQL 語句(用于控制該語句的行級別訪問權限)來實施 VPD。例如,如果 John Doe(他屬于 Department 10)輸入 SELECT * FROM emp 語句,則可以使用 VPD 添加 WHERE DEPT = 10 子句。這樣,您便可以通過對查詢進行修改來限制訪問某些行的數(shù)據(jù)。

虛擬專用數(shù)據(jù)庫確保無論用戶以何種方式訪問數(shù)據(jù)(通過應用程序、報表編寫工具或 SQL*Plus),都將強制實施同一強大的訪問權限控制策略。這樣,使用 VPD ,銀行便可以確??蛻糁豢吹剿麄冏约旱膸簦娦殴究梢园踩馗綦x客戶記錄,人力資源應用程序可以支持復雜的員工記錄數(shù)據(jù)訪問原則。

 

案例說明

1.  搭建環(huán)境--創(chuàng)建模式擁有者和相應的用戶,賦予權限

[c-sharp] view plaincopy?
  1. CONNECT sys/password@service AS SYSDBA;  
  2. CREATE USER schemaowner IDENTIFIED BY schemaowner  
  3. DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;  
  4. GRANT connect, resource TO schemaowner;  
  5.   
  6. CREATE USER user1 IDENTIFIED BY user1  
  7. DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;  
  8. GRANT connect, resource TO user1;  
  9.   
  10. CREATE USER user2 IDENTIFIED BY user2  
  11. DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;  
  12. GRANT connect, resource TO user2;  
  13.   
  14. GRANT EXECUTE ON DBMS_RLS TO PUBLIC;  
  15.   
  16. CONN schemaowner/schemaowner@service  
  17.   
  18. CREATE TABLE users   
  19. (id          NUMBER(10)   NOT NULL,   
  20.  ouser       VARCHAR2(30) NOT NULL,  
  21.  first_name  VARCHAR2(50) NOT NULL,  
  22.  last_name   VARCHAR2(50) NOT NULL);  
  23.   
  24. CREATE TABLE user_data   
  25. (column1     VARCHAR2(50) NOT NULL,  
  26.  user_id     NUMBER(10)   NOT NULL);  
  27.   
  28. INSERT INTO users VALUES (1,'USER1','User','One');  
  29. INSERT INTO users VALUES (2,'USER2','User','Two');  
  30. COMMIT;  
  31.   
  32. GRANT SELECT, INSERT ON user_data TO user1, user2  

 

2.  創(chuàng)建上下文和上下文的包(Context)

[c-sharp] view plaincopy?
  1. CONNECT sys/password@service AS SYSDBA;  
  2. GRANT create any context, create public synonym TO schemaowner;  
  3.   
  4. CONNECT schemaowner/schemaowner@service;  
  5.   
  6. CREATE CONTEXT SCHEMAOWNER USING SCHEMAOWNER.Context_Package;  
  7.   
  8. CREATE OR REPLACE PACKAGE Context_Package AS  
  9.   PROCEDURE Set_Context;  
  10. END;  
  11. /  

 

包的具體代碼:

[c-sharp] view plaincopy?
  1. CREATE OR REPLACE PACKAGE BODY Context_Package IS  
  2.   PROCEDURE Set_Context IS  
  3.     v_ouser  VARCHAR2(30);  
  4.     v_id     NUMBER;  
  5.   BEGIN  
  6.     DBMS_Session.Set_Context('SCHEMAOWNER','SETUP','TRUE');  
  7.     v_ouser := SYS_CONTEXT('USERENV','SESSION_USER');  
  8.       
  9.     BEGIN  
  10.       SELECT id  
  11.       INTO   v_id  
  12.       FROM   users  
  13.       WHERE  ouser = v_ouser;  
  14.         
  15.       DBMS_Session.Set_Context('SCHEMAOWNER','USER_ID', v_id);  
  16.     EXCEPTION  
  17.       WHEN NO_DATA_FOUND THEN  
  18.         DBMS_Session.Set_Context('SCHEMAOWNER','USER_ID', 0);  
  19.     END;  
  20.       
  21.     DBMS_Session.Set_Context('SCHEMAOWNER','SETUP','FALSE');  
  22.   END Set_Context;  
  23. END Context_Package;  
  24. /  
  25. SHOW ERRORS  
  26.   
  27. GRANT EXECUTE ON SCHEMAOWNER.Context_Package TO PUBLIC;  
  28. CREATE PUBLIC SYNONYM Context_Package FOR SCHEMAOWNER.Context_Package;  

解釋: 獲取當前登陸用戶名,并設置上下文中的變量USER_ID為當前用戶的ID,同時進行相應授權

 

3. 創(chuàng)建登陸觸發(fā)器

[c-sharp] view plaincopy?
  1. CONNECT sys/password@service AS SYSDBA;  
  2. CREATE OR REPLACE TRIGGER SCHEMAOWNER.Set_Security_Context  
  3. AFTER LOGON ON DATABASE  
  4. BEGIN  
  5.   SCHEMAOWNER.Context_Package.Set_Context;  
  6. END;  
  7. /  
  8. SHOW ERRORS  

 

4. 建立安全策略

[c-sharp] view plaincopy?
  1. CONNECT schemaowner/schemaowner@service;  
  2.   
  3. CREATE OR REPLACE PACKAGE Security_Package AS  
  4.   FUNCTION User_Data_Insert_Security(Owner VARCHAR2, Objname VARCHAR2)  
  5.     RETURN VARCHAR2;  
  6.     
  7.   FUNCTION User_Data_Select_Security(Owner VARCHAR2, Objname VARCHAR2)  
  8.     RETURN VARCHAR2;  
  9. END Security_Package;  
  10. /  
  11.   
  12.   
  13. CREATE OR REPLACE PACKAGE BODY Security_Package IS  
  14.   FUNCTION User_Data_Select_Security(Owner VARCHAR2, Objname VARCHAR2)RETURN VARCHAR2 IS  
  15.     Predicate VARCHAR2(2000);  
  16.   BEGIN  
  17.     Predicate := '1=2';  
  18.     IF (SYS_CONTEXT('USERENV','SESSION_USER') = 'SCHEMAOWNER') THEN  
  19.       Predicate := NULL;  
  20.     ELSE   
  21.       Predicate := 'USER_ID = SYS_CONTEXT(''SCHEMAOWNER'',''USER_ID'')';  
  22.     END IF;  
  23.     RETURN Predicate;  
  24.   END User_Data_Select_Security;  
  25.   
  26.   FUNCTION User_Data_Insert_Security(Owner VARCHAR2, Objname VARCHAR2) RETURN VARCHAR2 IS  
  27.     Predicate VARCHAR2(2000);  
  28.   BEGIN  
  29.     Predicate := '1=2';  
  30.     IF (SYS_CONTEXT('USERENV','SESSION_USER') = 'SCHEMAOWNER') THEN  
  31.       Predicate := NULL;  
  32.     ELSE   
  33.       Predicate := 'USER_ID = SYS_CONTEXT(''SCHEMAOWNER'',''USER_ID'')';  
  34.     END IF;  
  35.     RETURN Predicate;  
  36.   END User_Data_Insert_Security;  
  37. END Security_Package;  
  38. /  
  39. SHOW ERRORS  
  40.   
  41.   
  42. GRANT EXECUTE ON SCHEMAOWNER.Security_Package TO PUBLIC;  
  43. CREATE PUBLIC SYNONYM Security_Package FOR SCHEMAOWNER.Security_Package;  

 

5. 應用策略到相應的表,使用RDBMS_RLS

[c-sharp] view plaincopy?
  1. BEGIN  
  2.   DBMS_Rls.Add_Policy('SCHEMAOWNER''USER_DATA''USER_DATA_INSERT_POLICY',   
  3.                       'SCHEMAOWNER''SECURITY_PACKAGE.USER_DATA_INSERT_SECURITY',  
  4.                       'INSERT', TRUE);  
  5.   DBMS_Rls.Add_Policy('SCHEMAOWNER''USER_DATA''USER_DATA_SELECT_POLICY',  
  6.                       'SCHEMAOWNER''SECURITY_PACKAGE.USER_DATA_SELECT_SECURITY',  
  7.                       'SELECT');  
  8. END;  
  9. /  

 

5.  VPD測試

[c-sharp] view plaincopy?
  1. CONNECT user1/user1@service;  
  2. INSERT INTO schemaowner.user_data (column1, user_id) VALUES ('User 1', 1);  
  3. INSERT INTO schemaowner.user_data (column1, user_id) VALUES ('User 2', 2);  
  4. COMMIT;  
  5.   
  6. CONNECT user2/user2@service  
  7. INSERT INTO schemaowner.user_data (column1, user_id) VALUES ('User 1', 1);  
  8. INSERT INTO schemaowner.user_data (column1, user_id) VALUES ('User 2', 2);  
  9. COMMIT;  
  10.   
  11. CONNECT schemaowner/schemaowner@service  
  12. SELECT * FROM schemaowner.user_data;  
  13. CONNECT user1/user1@Service;  
  14. SELECT * FROM schemaowner.user_data;  
  15. CONNECT user2/user2@Service  
  16. SELECT * FROM schemaowner.user_data;  

 

測試結果:

(1) user1用戶登陸的: 只用第一條insert成功

(2)  user2用戶登陸的: 只用第二條insert成功

(3) 關于查詢:

        user1和user2都只能看到自己的資料,而schemaowner可以看到所有的資料。這里重點是所添加的謂詞不同,在安全策略中的

        Predicate := 'USER_ID = SYS_CONTEXT(''SCHEMAOWNER'',''USER_ID'')';

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多