热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

oracle中角色中权限剥离

1Oracle三层权限体系【复习】1、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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


推荐阅读
  • 本文探讨了在 SQL Server 中使用 JDBC 插入数据时遇到的问题。通过详细分析代码和数据库配置,提供了解决方案并解释了潜在的原因。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文探讨了在Oracle数据库中,动态SQL语句的执行及其对事务管理的影响,特别是关于回滚操作的有效性。重点讨论了一个具体场景:将预警短信从当前表迁移到历史表时遇到的字段长度不匹配问题及相应的异常处理。 ... [详细]
  • 使用Pandas高效读取SQL脚本中的数据
    本文详细介绍了如何利用Pandas直接读取和解析SQL脚本,提供了一种高效的数据处理方法。该方法适用于各种数据库导出的SQL脚本,并且能够显著提升数据导入的速度和效率。 ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • 本文探讨了如何利用HTML5和JavaScript在浏览器中进行本地文件的读取和写入操作,并介绍了获取本地文件路径的方法。HTML5提供了一系列API,使得这些操作变得更加简便和安全。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 本文探讨了如何使用pg-promise库在PostgreSQL中高效地批量插入多条记录,包括通过事务和单一查询两种方法。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 解决FCKeditor应用主题后上传问题及优化配置
    本文介绍了在Freetextbox收费后选择FCKeditor作为替代方案时遇到的上传问题及其解决方案。通过调整配置文件和调试工具,最终解决了上传失败的问题,并对相关配置进行了优化。 ... [详细]
author-avatar
手机用户2502854041
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有