Oracle系統權限基礎是創建在三個維度層面上,即系統權限(System Privilege)、對象權限(Object Privilege)和角色權限(Role Privilege)。系統權限定義了用戶能夠執行的某些行爲操做;對象權限定義了用戶在某個系統對象(如數據表、視圖等)的操做權限;角色權限更像是一個容器對象,能夠將一組系統權限、對象權限甚至其餘角色權限容納到其中。linux
三個維度權限在三個層面上構建了Oracle權限體系框架。傳統應用系統的一種配置方式是在數據庫層面創建用戶,配置相關權限進行操做。這樣的系統還能夠在一些舊應用系統或者國外業務系統中看到。隨着Web應用的普遍使用,Oracle權限體系需求的複雜性實際上是在不斷下降的。Web應用一般只須要鏈接一個Schema用戶名便可,用戶體系是在應用層面加以實現。數據庫
最近筆者遇到一個關於角色Role的問題,最後發現是一個Default Role這個常常被忽視的設置出現問題。本文主要系統介紹一下這個特色功能。session
一、環境介紹框架
Oracle的權限體系在過去的版本中都在不斷地發展豐富,筆者討論基於Oracle 11g,具體版本號爲11.2.0.4。ide
SQL> select * from v$version;對象
BANNERit
--------------------------------------------------------------------------------io
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Productionasm
PL/SQL Release 11.2.0.4.0 - Productiontable
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 – Production
創建一個全新的用戶。
SQL> create user test identified by test;
User created
二、Default Role概論
和系統權限、對象權限相比,角色權限是比較特殊的一種權限類型。它更像是一種組合容器,能夠將其餘權限以組Group的方式進行組織。通常來講,角色權限Role Privilege最經常使用的場景是簡化管理難度,實現標準化配置管理。另外一個角色權限的特色是動態賦予。系統權限和對象權限一旦賦予,用戶只要登陸就直接得到。而角色權限在這個問題上是能夠選擇的。
首先咱們進行默認設置,對用戶test進行一系列角色賦予動做。
SQL> grant connect, resource to test;
Grant succeeded
SQL> grant sicspccgrole to test;
Grant succeeded
SQL> grant sicspctbcgrole to test;
Grant succeeded
SQL> grant sicspctrrole to test;
Grant succeeded
經過視圖db_role_privs,能夠查看到角色與授予關係。
SQL> select * from dba_role_privs where GRANTEE='TEST';
GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
------------------------------ ------------------------------ ------------ ------------
TEST RESOURCE NO YES
TEST SICSPCCGROLE NO YES
TEST SICSPCTBTRROLE NO YES
TEST CONNECT NO YES
TEST SICSPCTBCGROLE NO YES
TEST SICSPCTRROLE NO YES
6 rows selected
重點關注default_role列,對應test的幾個權限,都被授予爲default_role。換而言之,一個用戶被賦予角色以後,直接就是默認角色即default role。
三、相關權限變化
若是角色對象底層權限發生變化,已經受權對象有什麼影響呢?
SQL> create role testrole ;
Role created
SQL> grant select on sics.cnu_environment to testrole;
Grant succeeded
SQL> grant testrole to test;
Grant succeeded
此時新角色testrole被授予爲default role。
SQL> select * from dba_role_privs where GRANTEE='TEST';
GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
------------------------------ ------------------------------ ------------ ------------
TEST RESOURCE NO YES
TEST SICSPCCGROLE NO YES
TEST SICSPCTBTRROLE NO YES
TEST TESTROLE NO YES
TEST CONNECT NO YES
TEST SICSPCTBCGROLE NO YES
TEST SICSPCTRROLE NO YES
7 rows selected
Testrole底層發生變化。
SQL> grant select on scott.emp to testrole;
Grant succeeded
角色受權關係沒有變化。
SQL> select * from dba_role_privs where GRANTEE='TEST';
GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
------------------------------ ------------------------------ ------------ ------------
TEST RESOURCE NO YES
TEST SICSPCCGROLE NO YES
TEST SICSPCTBTRROLE NO YES
TEST TESTROLE NO YES
TEST CONNECT NO YES
TEST SICSPCTBCGROLE NO YES
TEST SICSPCTRROLE NO YES
7 rows selected
一些相關實驗也證實,對於角色層面權限組的變化,不會影響到用戶與角色的關係。
四、Default Role設置副效應
Default Role是能夠單獨設置的,可是必定要注意,一旦使用Default Role顯式設置,會有一些副效應出現。
SQL> alter user test default role connect;
User altered
使用default role方法設置用戶test爲connect,以後觀察視圖。
SQL> select * from dba_role_privs where GRANTEE='TEST';
GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
---------- ------------------------------ ------------ ------------
TEST RESOURCE NO NO
TEST SICSPCCGROLE NO NO
TEST SICSPCTBTRROLE NO NO
TEST TESTROLE NO NO
TEST CONNECT NO YES
TEST SICSPCTBCGROLE NO NO
TEST SICSPCTRROLE NO NO
7 rows selected
注意,除了設置默認角色的connect以後,其餘test用戶角色都成爲非默認角色。也就是說:一旦進行顯式設置,其餘角色自動設置爲非默認角色。
五、Default Role效果
設置以後,咱們登陸test進行效果觀察。
SQL> conn test/test@sicsdb_linux
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as test
SQL> select * from user_role_privs;
USERNAME GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE OS_GRANTED
------------------------------ ------------------------------ ------------ ------------ ------------
TEST CONNECT NO YES NO
TEST RESOURCE NO NO NO
TEST SICSPCCGROLE NO NO NO
TEST SICSPCTBCGROLE NO NO NO
TEST SICSPCTBTRROLE NO NO NO
TEST SICSPCTRROLE NO NO NO
TEST TESTROLE NO NO NO
7 rows selected
在session層面,權限以下:
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
登陸以後,只有default role才能進行賦予,其餘角色權限不能自動添加。
--典型resource權限
SQL> create table t (id number(10));
create table t (id number(10))
ORA-01031: 權限不足
顯示設置角色權限:
SQL> set role resource;
Role set
SQL> create table t (id number(10));
Table created
SQL> select * from session_roles;
ROLE
------------------------------
RESOURCE
設置其餘角色以後,原有權限不能使用。
SQL> select * from session_roles;
ROLE
------------------------------
TESTROLE
SQL> create table m (id number(10));
create table m (id number(10))
ORA-01031: 權限不足
使用set role all,能夠將全部角色權限一併賦予。
SQL> set role all;
Role set
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
RESOURCE
SICSPCCGROLE
SICSPCTRROLE
SICSPCTBCGROLE
SICSPCTBTRROLE
TESTROLE
7 rows selected
從新登陸以後,依然是default role才能自動賦予。
SQL> conn test/test@sicsdb_linux
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as test
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
另外,使用set role all except xxx,能夠將指定的role剔除。
SQL> set role all except resource;
Role set
SQL> select * from session_roles;
ROLE
------------------------------
CONNECT
SICSPCCGROLE
SICSPCTRROLE
SICSPCTBCGROLE
SICSPCTBTRROLE
TESTROLE
6 rows selected
六、結論
Oracle角色role權限是一種很是經常使用的受權機制,default role特性是咱們常常忽視的一個問題知識點。
LHR@orclasm > alter user test default role all; User altered.SYS@orclasm > select * from dba_role_privs where GRANTEE='TEST';GRANTEE GRANTED_ROLE ADM DEF------------------------------ ------------------------------ --- ---TEST RESOURCE NO YESTEST TESTROLE NO YESTEST CONNECT NO YES