zoukankan      html  css  js  c++  java
  • 八、dbms_rls(实现精细访问控制)

    1、概述


    本报只适用于Oracle Enterprise Edition,它用于实现精细访问控制,并且精细访问控制是通过在SQL语句中动态增加谓词(WHERE子句)来实现的.
    通过使用ORACLE的精细访问控制特征,可以使不同数据库用户在执行相同SQL语句时操作同一张表上的不同数据.
    例如多个用户执行select * from emp时,各自看到的行数不同。A只能看到财务部的记录,B只能看到市场部的数据。

    2、包的组成

    1)、add_policy
    作用:用于为表、视图或同义词增加一个安全策略,当执行该操作结束是会自动提交事务。
    语法dbms_rls.add_policy(
    object_aschema in varchar2 null,
    object_name in varchar2,
    policy_name in varchr2,
    function_schema in varchar2 null,
    policy_function in varchar2,
    statement_type in varchar2 null,
    update_check in boolean false,
    enable in boolean true,
    static_policy in boolean false);
    其中

    • object_aschema:指定包含表、视图或同义词的方案(默认null表示当前方案),
    • object_name:指定要增加安全策略的表、视图或同义词,
    • policy_name:指定要增加的安全策略名称,
    • function_schema:指定策略函数的所在方案(默认null表示当前方案),
    • policy_function:指定生成安全策略谓词的函数名,
    • statement_type:指定使用安全策略的sql语句(默认null表示适用于select、insert、update、delete),
    • update_check:指定执行insert、update时是否检查安全策略,
    • enable:指定是否要激活安全策略,
    • static_policy:指定是否要生成静态的安全策略。


    2)、drop_policy
    作用:用于删除定义在特定表、视图或同义词的安全策略,当试行该操作结束时会自动提交事务。
    语法:dbms_rls.drop_policy(
    object_achema in varchr2 null,
    object_name in varchar2,
    policy_name in varchar2);

    3)、refresh_policy
    作用:用于刷新与安全策略修改相关的所有sql语句,并使得Oracle重新解析相关sql语句,自动提交。
    语法:dbms_rls.refresh_policy(
    object_achema in varchr2 null,
    object_name in varchar2 null,
    policy_name in varchar2 null);

    4)、enable_policy
    说明:用于激活或禁止特定的安全策略,默认情况下当增加安全策略时会自动激活,自动提交。
    语法:dbms_rls.enable_policy(
    object_achema in varchr2 null,
    object_name in varchar2,
    policy_name in varchar2,
    enable in boolean);

    5)、create_policy_group
    作用:用于建立安全策略组
    语法:dbms_rls.create_policy_group(object_schema varchar2, object_name varchar2,policy_group varchar2);
    其中policy_group指定策略组的名称。

    6)、add_grouped_policy
    作用:用于增加与特定策略组相关的安全策略。
    语法:dbms_rls.add_grouped_policy(object_schema varchar2, object_name varchar2,policy_group varchar2,policy_name varchar2,
    function_schema varchar2,policy_function varchar2,statement_types varchar2,update_check boolean,enabled boolean,static_policy boolean false);

    7)、add_policy_context
    作用:用于为应用增加上下文
    语法:dbms_rls.add_policy_context(object_schema varchar2,object_name varchar2,namespace varchar2,attribute varchar2);
    其中namespace指定命名空间,attribute指定上下文属性。

    8)、delete_policy_group
    作用:用于删除安全策略组
    语法:dbms_rls.delete_policy_group(object_schema varchar2,object_name varchar2,policy_group varchar2);

    9)、drop_grouped_policy
    作用:用于删除特定策略组的安全策略。
    语法:dbms_rls.drop_grouped_policy(object_schema varchar2,object_name varchar2,policy_group varchar2,policy_name varchar2);

    10)、drop_policy_context
    作用:用于删除对象的上下文。
    语法:dbms_rls.drop_policy_context(object_schema varchar2,object_name varchar2,namespace varchar2,attribute varchar2);

    11)、enable_grouped_policy
    作用:用于激活或禁止特定策略组的安全策略
    语法:dbms_rls.enable_grouped_policy(object_schema varchar2,object_name varchar2,group_name varchar2,policy_name varchar2,enable boolean);

    12)、refresh_grouped_policy
    作用:用于刷新与特定安全策略组的安全策略相关的sql语句(重新解析sql语句)
    语法:dbms_rls.refresh_grouped_policy(object_schema varchar2,object_name varchar2,group_name varchar2,policy_name varchar2);

    3、使用dbms_rls实现精细访问控制


    假设希望sys、system、scott用户可以访问emp表的所有员工,blake用于智能访问部门30的员工,jones用户只能访问部门20的员工,其他用户只能访问部门10的员工。

    步骤如下
    1)、建立应用上下文
    说明:要求用户必须具有create any context系统权限。
    create or replace context empenv using scott.ctx;--建立名称为empenv的应用上下文,其属性有scott方案的包ctx包设置。

    2)、建立包过程设置应用上下文属性
    create or replace package scott.ctx as
    procedure set_deptno;
    end;
    create or replace package body scott.ctx as
    procedure set_deptno is
    id number;
    begin
    if sys_context('userenv','session_user')='JONES' then
    dbms_session.set_context('empenv','deptno',20);
    elsif sys_context('userenv','session_user')='BLAKE' then
    dbms_session.set_context('empenv','deptno',30);
    else
    dbms_session.set_context('empenv','deptno',10);
    end if;
    end;
    end;

    3)、建立登录触发器
    说明:用户登录数据库之后会自动触发登陆触发器,建立登录触发器的目的是要隐含调用过程ctx.set_deptno,从而设置上下文属性。必须要以sys用户身份建立登陆触发器。
    conn sys/oracle as sysdba
    create or replace trigger login_trig
    after logon on database call scott.ctx.set_deptno

    4)、建立策略函数
    策略函数必须带有2个参数,第一个参数对应于方案名,第二个参数对应于表名、视图名、同义词名。
    create or replace package scott.emp_security as
    function emp_sec(p1 varchar2,p2 varchar2) return varchar2;
    end;
    create or replace package body scott.emp_security ad
    function emp_sec(p1 varchar2,p2 varchar2) return varchar2
    is
    d_predicate varchar2(2000);
    begin
    if user not in ('SYS','SYSTEM','SCOTT') then
    d_predicate:='deptno=SYS_CONTEXT(''empenv'',''deptno'')'
    return d_predicate;
    end if;
    return '1=1';
    end;
    end;

    5)、增加策略
    说明:增加策略,并定义对象、策略、策略函数以及SQL语句之间的对应关系。
    execute dbms_rls.add_policy('scott','emp','emp_policy','scott','emp_security.emp_sec','select');
    执行add_policy后会在系统默认策略组sys_default中增加策略emp_policy,并在scott.emp上的select语句使用该策略。
    其中第一个参数是对象所在方案名,第二个参数是对象名,第三个参数是策略名,第四个参数策略函数所在的方案名,
    第五个参数时策略函数,第六个参数是使用该策略的sql语句(如果不指定则select,insert,ypdate,delete都会使用该策略)

    当SYS,SYSTEM,SCOTT登录查询,谓词为1=1,当JONES登陆谓词为deptno=20,当blake登陆谓词为deptno=30。

  • 相关阅读:
    模拟google分页效果
    真理胜于一切 JAVA模拟表单提交
    springboot @vaule注解失效解决办法
    安装cnpm
    公众号微信支付开发
    vue去掉链接中的#
    springboot集成mongoDB简易使用
    Spring boot中使用aop详解
    Promise 的基础用法
    MySQL的if,case语句使用总结
  • 原文地址:https://www.cnblogs.com/champaign/p/9468557.html
Copyright © 2011-2022 走看看