久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    Oracle VPD實現數據細粒度訪問(更好的權限控制)

     guolijiegg 2012-01-18

    Oracle VPD實現數據細粒度訪問(更好的權限控制)

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

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

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

    虛擬專用數據庫如何工作

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

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

    虛擬專用數據庫確保無論用戶以何種方式訪問數據(通過應用程序、報表編寫工具或 SQL*Plus),都將強制實施同一強大的訪問權限控制策略。這樣,使用 VPD ,銀行便可以確保客戶只看到他們自己的帳戶,電信公司可以安全地隔離客戶記錄,人力資源應用程序可以支持復雜的員工記錄數據訪問原則。

     

    案例說明

    1.  搭建環境--創建模式擁有者和相應的用戶,賦予權限

    [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.  創建上下文和上下文的包(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. 創建登陸觸發器

    [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'')';

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

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 最新国产麻豆AⅤ精品无码| 国产成AV人片久青草影院| 亚洲欧美人成网站在线观看看| 在线观看国产成人AV天堂| 天码AV无码一区二区三区四区| 亚洲欧美日韩综合久久久| 亚洲精品无码久久一线| 亚洲国产精品久久久久久久 | 日韩内射美女人妻一区二区三区 | 亚洲综合在线一区二区三区| 激情五月开心婷婷深爱| 国产AV巨作丝袜秘书| 国产精品普通话国语对白露脸 | 亚洲精品日韩在线丰满| 日本中文字幕亚洲乱码| 日韩亚洲精品中文字幕| 亚洲国产成人无码AV在线影院L| 国产精品av中文字幕| 国产色视频一区二区三区| 2019国产精品青青草原| 国产日产欧产精品精品软件| 亚洲人成电影在线天堂色| 最新无码国产在线视频人与| 2020国产激情视频在线观看| 97人人添人人澡人人澡人人澡| 一二三四免费中文字幕| 视频二区中文字幕在线| 国产精品国产三级国产AV主播| A毛片终身免费观看网站| 99久久精品国产综合一区| 伊人久久精品无码麻豆一区| 日本一区二区三区免费播放视频站| 欧美无人区码一码二码三码的区别| 2020国产激情视频在线观看| 在线精品国产中文字幕| AAA级久久久精品无码片| 欧美中文字幕无线码视频| 欧洲免费一区二区三区视频| 美女裸体无遮挡免费视频网站| 亚洲中文字幕无码专区| AV喷水高潮喷水在线观看COM|