Oracle Fine-Grained Access Control Lab

本文根据Oracle官方文档整理,不到之处还望指出。

---------------------------------------------------------------------

                                                        Oracle精细化访问控制实验


一 介绍

     1.、强制用户只能查询属于“他们”的数据。

     2、通过在指定表上增加安全策略实现。

     3、通过动态修改用户查询语句以达到与预定义策略一致。

     下图很好的诠释了其原理:

 




二 实现过程

     1. 建立application context。

SQL> conn sys/admin as sysdba
已连接。
SQL> create context sales_orders_ctx
  2  using oe.sales_orders_pkg;

上下文已创建。

     2.创建与context对应的package。

SQL> conn oe/oe
已连接。
SQL> CREATE OR REPLACE PACKAGE sales_orders_pkg
  2  IS
  3   PROCEDURE set_app_context;
  4   FUNCTION the_predicate
  5    (p_schema VARCHAR2, p_name VARCHAR2)
  6     RETURN VARCHAR2;
  7  END sales_orders_pkg;    -- package spec
  8  /

程序包已创建。

SQL> CREATE OR REPLACE PACKAGE BODY sales_orders_pkg
  2  IS
  3    c_context CONSTANT VARCHAR2(30) := 'SALES_ORDERS_CTX';
  4    c_attrib  CONSTANT VARCHAR2(30) := 'SALES_REP';
  5
  6  PROCEDURE set_app_context
  7    IS
  8      v_user VARCHAR2(30);
  9  BEGIN
 10    SELECT user INTO v_user FROM dual;
 11    DBMS_SESSION.SET_CONTEXT
 12      (c_context, c_attrib, v_user);
 13  END set_app_context;
 14
 15  FUNCTION the_predicate
 16  (p_schema VARCHAR2, p_name VARCHAR2)
 17  RETURN VARCHAR2
 18  IS
 19    v_context_value VARCHAR2(100) :=
 20       SYS_CONTEXT(c_context, c_attrib);
 21    v_restriction VARCHAR2(2000);
 22  BEGIN
 23    IF v_context_value LIKE 'SR%'  THEN
 24      v_restriction :=
 25       'SALES_REP_ID =
 26        SUBSTR(''' || v_context_value || ''', 3, 3)';
 27    ELSE
 28      v_restriction := null;
 29    END IF;
 30    RETURN v_restriction;
 31  END the_predicate;
 32
 33  END sales_orders_pkg; -- package body
 34  /

程序包主体已创建。


     3.定义策略。

SQL> conn sys/admin as sysdba
已连接。
SQL> DECLARE
  2  BEGIN
  3    DBMS_RLS.ADD_POLICY (
  4     'OE',
  5     'ORDERS',
  6     'OE_ORDERS_ACCESS_POLICY',
  7     'OE',
  8     'SALES_ORDERS_PKG.THE_PREDICATE',
  9     'SELECT, INSERT, UPDATE, DELETE',
 10     FALSE,
 11     TRUE);
 12  END;
 13  /

     4.创建登录触发器。

SQL> CREATE OR REPLACE TRIGGER set_id_on_logon
  2  AFTER logon on DATABASE
  3  BEGIN
  4    oe.sales_orders_pkg.set_app_context;
  5  END;
  6  /

触发器已创建


     5.测试策略。


SQL> conn / as sysdba
已连接。
SQL> create user SR153 identified by oracle;

用户已创建

SQL> create user SR154 identified by oracle;

用户已创建
SQL> grant create session  to SR153;

授权成功。

SQL> grant create session  to SR154;

授权成功。
SQL> conn oe/oe
已连接。
SQL> grant select, update, delete on orders to SR153,SR154;

授权成功。

SQL> CONNECT SR153/oracle
已连接。
SQL> SELECT sales_rep_id, COUNT(*)
  2  FROM   oe.orders
  3  GROUP BY sales_rep_id;
SALES_REP_ID   COUNT(*)
------------ ----------
         153          5



CONNECT SR154/oracle
已连接。
SQL> SELECT sales_rep_id, COUNT(*)
  2  FROM   oe.orders
  3  GROUP BY sales_rep_id;

SALES_REP_ID   COUNT(*)
------------ ----------
         154         10

----------------------------

present by dylan.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值