FGA简介

本文详细介绍了如何通过五个步骤实现细粒度访问控制(FGA),包括建立上下文、设置上下文属性、建立登录触发器、建立策略函数及增加策略。并通过具体示例展示了不同用户登录时对同一表的不同访问权限。
FGA:细粒度访问控制:使用不同的用户名登录在查询相同表时返回不同的数据。
FGA的设置分为下面五个步骤:
一、        建立上下文:
二、设置上下文属性:
三、建立登录触发器:
四、建立策略函数
五、增加策略
二、        建立上下文:
SQL> conn / as sysdba
已连接。
SQL> create context empenv using scott.ctx;
上下文已创建。

二、设置上下文属性:
SQL> create package scott.ctx as procedure set_deptno;
  2  end;
  3  /

程序包已创建。

SQL> create package body scott.ctx as procedure set_deptno is
  2  id number;
  3  begin
  4  if sys_context('userenv','session_user')='JONES' then
  5  dbms_session.set_context('empenv','deptno',20);
  6  elsif sys_context('userenv','session_user')='BLAKE' then
  7  dbms_session.set_context('empenv','deptno',30);
  8  else
  9  dbms_session.set_context('empenv','deptno',10);
10  end if;
11  end;
12  end;
13  /

程序包体已创建。

三、建立登录触发器:
SQL> create trigger login_trig
  2  after logon on database call scott.ctx.set_deptno
  3  /

触发器已创建
四、建立策略函数
SQL> create package scott.emp_security as
  2  function emp_sec(p1 varchar2,p2 varchar2) return varchar2;
  3  end;
  4  /

程序包已创建。
  1  create or replace package body scott.emp_security as
  2  function emp_sec(p1 varchar2,p2 varchar2) return varchar2 is
  3  d_predicate varchar2(2000);
  4  begin
  5  if user not in('SYS','SYSTEM','SCOTT') then
  6  d_predicate:='deptno=SYS_CONTEXT(''empenv'',''deptno'')';
  7  return d_predicate;
  8  end if;
  9  return '1=1';
10  end;
11* end;
SQL> /

程序包体已创建。

五、增加策略
SQL> exec dbms_rls.add_policy('scott','emp','emp_policy','scott','emp_security.emp_sec','select');
PL/SQL 过程已成功完成。

到些FGA的设置已经完成了。
现在来体验一下FGA吧:
SQL> conn scott/tiger
已连接。
SQL> select ename,deptno from emp;

ENAME          DEPTNO
---------- ----------
SMITH              20
ALLEN              30
WARD               30
JONES              20
MARTIN             30
BLAKE              30
CLARK              10
SCOTT              20
KING               10
TURNER             30
ADAMS              20

ENAME          DEPTNO
---------- ----------
JAMES              30
FORD               20
MILLER             10

已选择14行。
SQL> conn jones/jones
已连接。
SQL> select ename,deptno from emp;
select ename,deptno from emp
                         *
第 1 行出现错误:
ORA-00942: 表或视图不存在


SQL> select ename,deptno from scott.emp;

ENAME          DEPTNO
---------- ----------
SMITH              20
JONES              20
SCOTT              20
ADAMS              20
FORD               20
SQL> conn blake/blake
已连接。
SQL> select ename,deptno from scott.emp;

ENAME          DEPTNO
---------- ----------
ALLEN              30
WARD               30
MARTIN             30
BLAKE              30
TURNER             30
JAMES              30

已选择6行。

========================
FGA:细粒度审计
建立策略函数:
SQL> exec dbms_fga.add_policy(object_schema=>'scott',-
> object_name=>'emp',policy_name=>'chk_emp',-
>  audit_condition=>'deptno=20',audit_column=>'sal',-
>  statement_types=>'update,select')

PL/SQL 过程已成功完成。
策略函数已经建立完毕。、
可以通过这个查询来查看策略函数是否建立完成。
select t.object_schema,t.object_name,t.policy_name,t.enabled from dba_audit_policies t;

开始体验FGA了:
执行下列语句:
SQL> conn scott/tiger
已连接。
SQL> update emp set sal=sal+.1 ;

已更新14行。

SQL> commit;

提交完成。
查看审计结果:
select * from dba_fga_audit_trail;
1        120        2006-10-13 15:13:13        SCOTT        0914-32/Administrator        EPORT0/0914-32                0914-32/Administrator        SCOTT        EMP        CHK_EMP        363592        update emp set sal=sal+.1                         UPDATE        13-10月-06 03.13.13.147000 下午 +08:00                        0        308:1016        0400040047000000        8        1
====================== 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值