zoukankan      html  css  js  c++  java
  • ORACLE自主访问控制机制系统表

    Oracle数据库的访问机制包含:自主访问控制(DAC)和强制访问控制(MAC)。以下是自主访问控制(DAC)机制的系统表研究:

    访问控制是允许或者禁止某人访问某资源的过程,数据库中就是限制用户对数据库客体(如表、试图等)的访问。实现这种访问控制一般是基于访问控制列表(ACL),ACL一般记录了who能访问what以及how访问。大多数据库的将ACL以数据库系统表的形式进行实现。下面具体介绍下ORACLE中的权限相关系统表的设计。

           ORACLE中的权限分为两种:系统权限和对象权限。

    系统权限

      系统权限包括数据库管理权限和带有ANY的权限。管理权限如ALTER DATABASE,CREATE USER等权限,这类权限是和DDL相关的权限。另一类带有ANY的权限,如SELECT ANY TABLE,表示可以查询所有表的权限,这类权限是全局DML相关的权限。查看所有的系统权限可以通过表SYSTEM_PRIVILEGE_MAP,该视图显示了权限名称及其对应的值,通过表可以看出所有的系统权限的权限值均为负数。

      记录用户的系统权限授权的信息主要存储在系统表SYS.SYSAUTH$表中,可以通过DBMA_METADATA包获取表的创建信息。

    SQL> select dbms_metadata.get_ddl('TABLE','SYSAUTH$','SYS') from dual;
           DBMS_METADATA.GET_DDL('TABLE','SYSAUTH$','SYS')
          CREATE TABLE "SYS"."SYSAUTH$"
         ( "GRANTEE#" NUMBER NOT NULL ENABLE,
           "PRIVILEGE#" NUMBER NOT NULL ENABLE,
           "SEQUENCE#" NUMBER NOT NULL ENABLE,
           "OPTION$" NUMBER
          ) PCTFREE
         PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING 10 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 147483645
        PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
        TABLESPACE "SYSTEM"

      可以看到表字段信息,包含GRANTEE#,PRIVILEGE#,SEQUENCE#和OPTION$。GRANTEE#表示被授权者的UID,PRIVILEGE#表示被授权的权限值,OPTION$表示是此权限否可被转授,SEQUENCE#个人感觉是时间戳的概念,对于这个的验证放在后面。由此可见,系统权限和角色的授予,并不记录授权者的信息。通过查询这张表,可以看到PRIVILEGE#字段并不是上面所说的全是负数,还存在正数,不错,这是因为这张表不仅仅存放了系统权限,还存放了角色的授予信息,如果授予角色的时候,PRIVILEGE#字段即为角色的ID,当然角色也可能被授予角色和系统权限,因此想通过简单的SQL语句获取一个用户所拥有的所有的角色或所有的系统权限,会涉及到递归的查询,大家可以想下如何构造这个SQL语句,(提示下:ORACLE特有的CONNECT BY语法)。

      由系统权限的系统表可以看出,对于系统权限,ORACLE中并不记录授权者的概念,这说明对系统权限的回收肯定是特定用户进行的,由于没有授权者的概念,当然也就没有了级联回收系统权限的情况,这里SEQUENCE#字段作为时间戳貌似也没有太大的意义了。

    对象权限

      对象权限主要记录用户被赋予某对象的某种权限,如用户A被授予表TB1的SELECT权限。由此可见,对象权限系统表需要具有如下几个字段:授权者,被授予者,对象,权限类型,转授标记。对象权限系统表是SYS.OBJAUTH$,首先来看表定义。

    SQL> select dbms_metadata.get_ddl('TABLE','OBJAUTH$','SYS') from dual;
    DBMS_METADATA.GET_DDL('TABLE','OBJAUTH$','SYS')
    ----------------------------------------------------------------------
     CREATE TABLE "SYS"."OBJAUTH$"
     ( "OBJ#" NUMBER NOT NULL ENABLE,
       "GRANTOR#" NUMBER NOT NULL ENABLE,
       "GRANTEE#" NUMBER NOT NULL ENABLE,
       "PRIVILEGE#" NUMBER NOT NULL ENABLE,
       "SEQUENCE#" NUMBER NOT NULL ENABLE,
       "PARENT" ROWID,
       "OPTION$" NUMBER,
       "COL#" NUMBER
       ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING

    系统表中存在并不是所猜想的那么几个字段,除了对象(OBJ#),授权者(GRANTOR#),被授予者(GRANTEE#),具体权限(PRIVELGE#),转授标志(OPTION$)外,还具有SEQUENCE#,PARENT和COL#,SEQUENCE#应该还是时间戳,COL#是指在进行列级授权时记录的列号,在对表进行授权时,可以指定列,如GRANT SELECT(C1) ON T1 TO U1。至于PARENT还有待考证啊。

  • 相关阅读:
    Why Choose Jetty?
    Jetty 的工作原理以及与 Tomcat 的比较
    Tomcat设计模式
    Servlet 工作原理解析
    Tomcat 系统架构
    spring boot 打包方式 spring boot 整合mybaits REST services
    wireshark udp 序列号 User Datagram Protocol UDP
    Maven 的聚合(多模块)和 Parent 继承
    缓存策略 半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完全自动化的框架我更喜欢mybatis
    Mybatis解决sql中like通配符模糊匹配 构造方法覆盖 mybits 增删改
  • 原文地址:https://www.cnblogs.com/luoyx/p/2295166.html
Copyright © 2011-2022 走看看