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(1,1);

INSERT INTO PDM.TEST_VPD VALUES(2,1);

INSERT INTO PDM.TEST_VPD VALUES(1,2);

INSERT INTO PDM.TEST_VPD VALUES(2,2);

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;

/

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: