1 | Oracle三層權限體系【複習】 |
1、Oracle的權限體系劃分為三個層次:角色role、系統system和對象object。下面進行簡單的說明: ü 對象權限(object privilege),是權限體系的最小粒度對象。特點是權限點在對象上。此處的對象,包括Oracle體系下包括資料表、視圖、序列、包、存儲過程等十一種對象的權限。每種對象都有對應的權限點。比如,對資料表有select、update等操作權限; ü 系統權限(system privilege),是描述Oracle使用者操作的另一個層面。定義了使用者在系統中可以做什麼,如Create table之類。注意,一些系統權限和對象權限可能存在重疊的情況。要小心使用。 ü 角色權限(role privilege),是對象權限和系統權限、甚至包括角色權限的複合體。對象權限和系統權限都是粒度很細的權限單元,一類使用者往往需要相同的對象權限集合和系統權限集合。如果分别進行設定,就可能存在遺漏的可能,依據職責進行role角色設定,之後将角色附加給使用者,是一種更加簡單的方法; 2、對象權限object privilege 對象權限是Oracle的基礎權限,定義了使用者在某個特定對象上可以使用何種權限。注意,此處我們談到的對象權限,是針對已經存在對象的權限。目前,Oracle支援十一種對象的九方面權限,并不是每類型對象都有全部的九個方面權限。詳細如下表: 從上表中可以看出,根據對象的不同,可以進行賦予的權限也是不同的。此外,還有一個隐式的all權限,表示對象可以賦予的全部權限資訊。視圖方面,可以使用user_tab_privilege和table_privilege等視圖檢查對象的通路授權情況。 3、系統權限System Privilege:系統權限是Oracle内置定義的,在Oracle10g中有大約160餘個系統權限 4、角色權限role privilege:角色權限可以接受各種系統權限和對象權限,也可以包括其他的角色權限。在實際開發過程中,我們自定義角色的場景其實不是很多,因為自定義角色權限後,在開發使用時是有很多的限制的。需要注意的問題是,不同版本的Oracle,預定義角色可能存在差異。 | |
2 | 角色role不能循環賦予 |
//自定義兩個空權限角色; SQL> create role r_t; Role created SQL> create role r_m; Role created //互相嘗試賦予權限; SQL> grant r_t to r_m; Grant succeeded SQL> grant r_m to r_t; grant r_m to r_t ORA-01934:檢測到循環的角色授權 實驗結論顯而易見:Oracle在進行grant角色相關授權的時候,會自動進行循環檢測,如果發現循環,就禁止掉操作。 | |
3 | 角色權限在存儲過程中的剔除效應 |
角色的确是一種很友善的權限集合組織方式,在很多系統中也是廣泛應用。但是在Oracle中,使用角色權限role privilege是要格外小心的,特别是進行資料庫開發過程中。因為Oracle存儲過程等結構對角色權限有剔除效應。 【實驗】 //建立實驗角色r_cat_role SQL> create role r_cat_role ; Role created //授予系統權限select any dictionary給實驗角色,select any dictionary權限可以通路到Oracle的大部分中繼資料視圖。 SQL> grant select any dictionaryto r_cat_role; Grant succeeded //建立使用者 SQL> create user mytest identified by mytest; User created SQL> grant create session to mytest; Grant succeeded SQL> grant r_cat_role to mytest; Grant succeeded SQL> grant create procedure to mytest; Grant succeeded SQL> conn mytest/mytest@ora11g; Connected to Oracle Database11gEnterpriseEdition Release11.2.0.1.0 Connected as mytest SQL> select count(*) fromdba_objects; COUNT(*) ---------- 72282 dba_objects視圖是中繼資料字典的一個組成部分。mytest使用者在接受角色權限r_cat_role之後,具有了在SQL中直接使用的權限。下面我們構造存儲過程如下: SQL> create or replace procedure P_TEST_NC 2 is 3 n_res number; 4 begin 5 select count(*) 6 into n_res 7 from dba_objects; 8 9 dbms_output.put_line(to_char(n_res)); 10 end P_TEST_NC; 11 / Warning: Procedure created with compilation errors SQL> select * from user_errors; NAME TYPE SEQUENCE LINE POSITION TEXT ATTRIBUTE ---------- ------------ ---------- ---------- ---------- ---------------------------------------- --------- P_TEST_NC PROCEDURE 1 7 8 PL/SQL: ORA-00942:表或視圖不存在 ERROR P_TEST_NC PROCEDURE 2 5 3 PL/SQL: SQL Statement ignored ERROR 編譯報錯,看起來不可思議。明明mytest使用者具有dba_objects視圖的通路權限,而且在SQL語句直接可以使用。我們說,就是因為通路dba_objects的權限是通過角色授予的。存儲過程等Oracle代碼結構具有一個特性,就是可以将使用者的三層權限(role、system和object)中的role權限剝離掉。 | |
4 | 系統權限和對象權限沖突 |
系統權限中包括一部分與對象有關的内容。如select any table、execute any procedure等。這些和對象權限之間存在一些重疊的部分。 【實驗】 SQL> create user mytest identified by mytest; User created SQL> grant connect, resource to mytest; Grant succeeded SQL> grant select any table to mytest; Grant succeeded SQL> conn mytest/mytest@orcl; Connected to Oracle Database10gEnterpriseEdition Release10.2.0.1.0 Connected as mytest SQL> select count(*) from scott.emp; COUNT(*) ---------- 14 嘗試可否從scott使用者上禁止mytest對m的通路。 SQL> conn scott/tiger@orcl; Connected to Oracle Database10gEnterpriseEdition Release10.2.0.1.0 Connected as scott SQL> revoke select on t from mytest; revoke select on t from mytest ORA-01927:無法REVOKE您未授權的權限 可見看出,對Oracle的revoke而言,隻能revoke授予過的權限。未授予過的權限,或者嘗試對系統權限、對象權限語義的拆分,都是不能做到的。 | |
5 | 擁有select any table權限,但是對sys使用者下的資料表,是不能通路的。這是Oracle内部對于sys使用者核心對象的一種保護措施。例如sys使用者建立了一張test表,具有select any table權限的使用者是無法查詢sys.test表。 此外具有select any table 權限的使用者也無法檢視sys schema下的系統視圖,要想檢視,需要把參數o7...設定成true |