oracle中角色中权限剥离

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值