oracle行列级权限控制(VPD)

oracle行列级权限控制(VPD)

一、背景

在数据访问中一般的访问权限控制是通过创建视图实现的,基于某个基础表创建不同的视图,将视图的查询权限赋予特定的数据查询方,使得不同的用户只能访问到特定的数据。

那么有没有办法让不同的用户访问同一张表的时候,只能看到自己权限范围内的数据,不通过视图实现,显然是有的。

虚拟专用数据库(VPD)指的是,通过在数据库里进行配置,从而让不同的用户只能查看某 个表里的部分数据。VPD分为以下两个级别。

  • 行级别:在该级别下,可以控制某些用户只能查看到某些数据行。比如,对于销售数据表sales 来说,每个销售人员只能检索出他自己的销售数据,不能查询其他销售人员的销售数据。

  • 列级别:在该级别下,可以控制某些用户不能检索某个表的某个列的值。比如用户HR 下的 employees 表中,含有工资(salary)列,由于该列比较敏感,因此不让其他用户查询该列的值。 其他用户检索该列时,会发现其值全都为空(null )。

二、行级权限控制

1、创建测试表

CREATE TABLE PDM.TEST_VPD(
CAN_SELECT NUMBER
,NO_SELECT NUMBER
);

2、插入测试数据

INSERT INTO PDM.TEST_VPD VALUES(11);
INSERT INTO PDM.TEST_VPD VALUES(21);
INSERT INTO PDM.TEST_VPD VALUES(12);
INSERT INTO PDM.TEST_VPD VALUES(22); 

3、创建政策函数

创建策略函数,作为行级权限的逻辑判断。当用户访问该表时获取当前用户的信息,用来判断外部访问用户,根据访问的用户不同设置不同的访问权限 限制在ADM_NRT访问PDM.TEST_VPD表时,默认添加对用户完全透明的访问条件NO_SELECT = 2

CREATE OR REPLACE FUNCTION F_LIMITED_QUERY_LINE(S_CHEMA IN VARCHAR2
,S_OBJECT IN VARCHAR2)
RETURN VARCHAR2
AS
VAR_O_RE VARCHAR2(50);
VC_USERID VARCHAR2(100);
BEGIN
     --获取上下文信息
     SELECT SYS_CONTEXT(‘USERENV’,SESSION_USER)
     INTO VC_USERID
FROM DUAL;
    --做行级访问限制
     IF TRIM(VC_USERID) = 'ADM_NRT' THEN
        VAR_O_RE := 'NO_SELECT = 2';
     ELSE
        VAR_O_RE := NULL;
     END IF;
     
     RETURN VAR_O_RE;
END;
/

4、定义FGAC规则

限制访问PDM用户下的表TEST_VPD,政策名称为LIMITED_QUERY_LINE,政策函数为PDM用户下的F_LIMITED_QUERY_LINE,政策类型为SELECT类型,启用该FGAC规则

BEGIN
    DBMS_RLS.ADD_POLICY(OBJECT_SCHEMA => 'PDM'
        ,OBJECT_NAME => 'TEST_VPD'
        ,POLICY_NAME => 'LIMITED_QUERY_LINE'
        ,FUNCTION_SCHEMA => 'PDM' 
        ,POLICY_FUNCTION => 'F_LIMITED_QUERY_LINE'
        ,STATEMENT_TYPES => 'SELECT'
        ,ENABLE => TRUE);
END;
/

5、查询策略

SELECT POLICY_NAME,SEL,INS,UPD,DEL,IDX,CHK_OPTION,ENABLE 
FROM USER_POLICIES;

6、去掉访问限制

BEGIN
    DBMS_RLS.DROP_POLICY(
    	OBJECT_SCHEMA => 'PDM'
       ,OBJECT_NAME => 'TEST_VPD'
       ,POLICY_NAME => 'LIMITED_QUERY_LINE'
    );
END;
/

三、列级权限控制

1、创建政策函数

CREATE OR REPLACE FUNCTION F_LIMITED_QUERY_LINE(S_CHEMA IN VARCHAR2
,S_OBJECT IN VARCHAR2)
RETURN VARCHAR2
AS
VAR_O_RE VARCHAR2(50);
VC_USERID VARCHAR2(100);
BEGIN
     --获取上下文信息
     SELECT SYS_CONTEXT(‘USERENV’,SESSION_USER)
     INTO VC_USERID
FROM DUAL;
    --做行级访问限制
     IF TRIM(VC_USERID) = 'ADM_NRT' THEN
        VAR_O_RE := '1 = 2';
     ELSE
        VAR_O_RE := NULL;
     END IF;
     
     RETURN VAR_O_RE;
END;
/

2、定义FGAC规则

SEC_RELEVANT_COLS 要屏蔽的列(用逗号隔开)

SEC_RELEVANT_COLS_OPT =>DBMS_RLS.ALL_ROWS说明对所有记录屏蔽该列

BEGIN
    DBMS_RLS.ADD_POLICY(OBJECT_SCHEMA => 'PDM'
        ,OBJECT_NAME => 'TEST_VPD'
        ,POLICY_NAME => 'LIMITED_QUERY_COL'
        ,FUNCTION_SCHEMA => 'PDM'
        ,POLICY_FUNCTION => 'F_LIMITED_QUERY_LINE'
        ,STATEMENT_TYPES => 'SELECT'
        ,SEC_RELEVANT_COLS =>'CAN_SELECT'
        ,SEC_RELEVANT_COLS_OPT =>DBMS_RLS.ALL_ROWS
        ,ENABLE => TRUE);
END;
/
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值